![c647353c339a7c8c3851d26cb23af1b2.gif](https://i-blog.csdnimg.cn/blog_migrate/639a62850757ad3f3df59aeefc8ac14b.gif)
“ 分享与快乐同在!”
最近有小伙伴询问如何按指定分隔符分割字符串,在karel中并没有按字符分割的内置程序供我们使用,那么我们就来实现这个功能!
在项目中,经常会在字符串中提取数据,比如机器人与相机使用TCP/IP通讯、字符串文本中数据提取等等。如何按字符将一个字符串数据拆分为多个字符串,最终将字符串转换为其他数据类型?
实现代码:
注:在代码中并未将字符串转为real数据类型,那只是调用一下内置函数。
PROGRAM str_cut1%STACKSIZE = 4000%INCLUDE ../0_Lib/libTypeVAR PList:PRMType --参数存放位置 count,i,prmCount:INTEGER --字符串分割后存放位置,根据实际需求设定数组、字符串长度。 StrList:ARRAY[30] OF STRING[30] --字符串剪切分割 ROUTINE str_split(source,split:STRING;strArray:ARRAY OF STRING):INTEGER FROM libRoutine --获取参数函数 ROUTINE GetPRM(count:INTEGER;valueType:ARRAY OF INTEGER;intValue:ARRAY OF INTEGER;realValue:ARRAY OF REAL;str:ARRAY OF STRING;stateValue:ARRAY OF INTEGER):INTEGER FROM libRoutine BEGIN --获取参数 prmCount = GetPRM(PList.count , PList.valueType , PList.intValue , PList.realValue , PList.str , PList.statusValue) --判断参数1、2 均为字符串 IF((prmCount =2) AND ( PList.valueType[1] = strType ) AND ( PList.valueType[2] = strType ) ) THEN --按参数2字符串,分割参数1字符串,结果存放在 Strlist数组中 count = str_split(PList.str[1],PList.str[2],StrList) --打印分割后,字符串段数 WRITE(CR,'total:',count,CR) --遍历打印字符串 FOR i=1 TO count DO WRITE(' [',StrList[i],'] ') ENDFOR ENDIF --end--END str_cut1
程序中,引用了libroutine文件中的 str_split函数来实现字符串分割。
str_split函数有3个参数:
source:需要被分割的字符串。
split: 分割符号
strArray:分割后的字符串
返回值:字符串被分割后的段数,如果没有分割,也将返回1。
libRoutine 文件中 str_split函数实现代码:
--按字符分割字符串--source:被分割字符串--split:分割符,支持多个字符--strArray:分割后的单个字符串数组ROUTINE str_Split(source,split:STRING;strArray:ARRAY OF STRING):INTEGERVAR count,i:INTEGER splitLen:INTEGER sourceLen:INTEGER readPos:INTEGER splitIndex:INTEGER strTemp:STRING[254] maxCount:INTEGERBEGIN count =0 splitIndex = 0 readPos = 1 splitLen = STR_LEN(split) sourceLen = STR_LEN(source) maxCount = ARRAY_LEN(strArray) IF (splitLen = 0) OR (sourceLen = 0) THEN RETURN (0) ENDIF FOR i = 1 TO maxCount DO --复制源字符串 strTemp = SUB_STR(source,readPos,sourceLen) --查找分隔符位置 splitIndex = INDEX(strTemp,split) count=count+1 IF splitIndex > 0 THEN readPos = readPos + splitIndex+splitLen-1 --剪切字符串 strArray[count] = SUB_STR(strTemp,1,splitIndex-1) else strArray[count] = strTemp RETURN (count) ENDIF --判断越界 IF readPos > sourceLen THEN RETURN (count) ENDIF ENDFOR RETURN (count) END str_Split
OK!今天的分享到此结束,记得分享哦!
NO.97
Robot Tips
2020
![67a45a9bbe3e8ae4820d360c32cdeac0.gif](https://i-blog.csdnimg.cn/blog_migrate/06563d209cff6fb651af7e3d9fe56fad.gif)