【CAPL】常见的字符串处理函数
大纲
格式化字符串snprintf()
-
作用
- 整合到字符串,供后续输出使用,
- 可以防止类型不匹配等导致的错误
-
格式:
long snprintf(char dest[], long len, char format[], ...);
- dest:存储本此整合完毕的字符串
- len:dest数组的最大长度
char format[], ...
:放入dest的若干format
-
elcount()
- 格式:
long elcount(arrName)
或dword elcount(arrName)
- arrName是函数参数时为long,其他情况为dword
- 格式:
-
代码示例
char buffer[100], str[7] = "Vector"; long i; i = snprintf(buffer,elcount(buffer),"String: %s\n", str); write("Output:\n%s : Character count = %d\n", buffer, i);
时间戳报文
timeNow()
- 格式:
dword timeNow();
- 作用:获取闪电开始运行后的相对时间,单位:10um
- 示例:
float x; x = timeNow()/100000.0; //current time in seconds
getlocaltime(arr)
- 格式:
void getLocalTime(long time[]);
- 参数:数组time,用于存放函数返回值
- 作用:返回存放在long数组中的系统绝对时间
- 注:常用前3个元素,即索引0,1,2对应的s,min,hour
- 注:常用前3个元素,即索引0,1,2对应的s,min,hour
- 代码示例:
long tm[9]; getLocalTime(tm); // now tm contains the following entries: // tm[0] = 3; (seconds) // tm[1] = 51; (minutes) // tm[2] = 16; (hours) // tm[3] = 21; (day of month) // tm[4] = 7; (month stating with 0) // tm[5] = 98; (year) // tm[6] = 5; (weekday) // tm[7] = 232;(day of year) // tm[8] = 1; (Summer time)
时间戳函数结合snprintf输出的代码示例
-
要点:
timeNow()/100.0
: 除以100.0,结果作为float类型%02d min
: 02表示有效数字为2个,例如改为04则min结果显示为0057
-
代码示例:
on key 'a' { long time[9];//匹配getLocalTime的long 9元素, timeNow()直接使用即可 char arrTarget[100];//放snprintf的字符串 //timeNow():先放入snprintf(),后输出arrTarget snprintf(arrTarget,elCount(arrTarget),"timeNow(): %f ms",timeNow()/100.0); write(arrTarget); //getLocalTime(): 先放入time,后放入snprintf getLocalTime(time); snprintf(arrTarget,elCount(arrTarget),"getLocalTime():%02d hour, %02d min, %02d s",time[2],time[1],time[0]); write(arrTarget); }
-
结果:
字符串拼接strncat()
-
作用
- 拼接字符串:
dest + src + \0
- 拼接字符串:
-
格式
void strncat(char dest[], char src[], long len);
- dest: 目标字符串
- src: 新加入的字符串
- len: 拼接后,包含字符串结尾的
\0
在内的字符总数
-
代码示例
char s[20]; strncpy(s, "Vector", 10); // s is "Vector" strncat(s, " CANoe", 19); // s is "Vector CANoe" strncpy(s, "Vector", 10); // s is "Vector" strncat(s, " CANoe", 11); // s is "Vector CAN"
字符串替换str_replace()
-
作用
- 将原子串s1替换为新的子串s2
-
格式
long str_replace(char s[], char searched[], char replacement[]);
long str_replace(char s[], long startoffset, char replacement[], long length);
- s: 原字符串,将被修改
- searched[]: 将被替换掉的字符串
- replacement[]: 将替换成的字符串
- startoffset: 指定开始替换的位置,从0开始计数
- long length: 指定要替换掉的字符串长度,与replacement和最终结果的长度不强相关
- 格式2的startoffset和long length:本质上还是指定被替换字符串,通过起始位置和长度来指定
-
帮助文档
-
代码示例1
char buffer[70] = "Vector Informatik"; str_replace(buffer, "Informatik", "CANoe"); write(buffer); //输出Vector CANoe str_replace(buffer, 7, "CANalyzer", 10); write(buffer); //输出Vector CANalyzer
-
代码示例2
char buffer[70] = "0123456789abcd"; str_replace(buffer, 7, "XYZXYZ", 3); write(buffer); //输出:0123456XYZXYZabcd,取代了原字符串中的789
字符串查找strstr()/strstr_off()
-
作用
- 在s1中查找字符串s2的位置;找不到则返回-1
-
格式
long strstr(char s1[], char s2[]);
long strstr_off(char s1[], long offset, char s2[]);
- offset:s1开始查找的索引值,从0开始,注意offset参数在s1和s2中间
-
帮助文档
-
代码示例
- strstr_off()中:如果offset值超过包含s2的部分,也会返回-1
long pos; char s1[18] = "Vector Informatik"; char s2[11] = "Informatik"; pos = strstr(s1, s2); // pos = 7 write("%d",pos); pos = strstr_off(s1, 8, s2); // pos = -1 write("%d",pos); pos = strstr_off(s1, 3, s2); // pos = 7 write("%d",pos);
拷贝字符串:整体拷贝strncpy()
-
作用
- 将src整理拷贝到dest
-
格式
void strncpy(char dest[], char src[], long len);
- len:所拷贝的字符串长度,不大于dest,且包含字符串结尾的
\0
- 注意:返回值void,
pos = strncpy(xx);
赋值给变量会报错
-
帮助文档
-
代码示例
char s1[18] = "Vector Informatik"; char s2[11]; strncpy(s2, s1, elCount(s2)); // s2拷贝给s1 write(s2); //输出:Vector Inf(10个字符+\0)
拷贝字符串:分度拷贝substr_cpy()
-
作用
- 将src的子串拷贝到dest
-
格式
void substr_cpy(char dest[], char src[], long srcStart, long len, long max);
- srcStart和len:src的开始索引和长度,注意len
- len: 复制的子串长度,或-1拷贝全部
- max:dest的大小
elcount(dest));
- 同上,注意返回值void
-
帮助文档
-
代码示例
char s1[18] = "Vector Informatik"; char s2[11]; substr_cpy(s2, s1, 2, 8, elCount(s2)); // s1:从索引2开始的8个字符的子串拷给s1 write(s2); //输出: ctor Inf
字符串转数字atol()
-
作用
- 字符串转换为long类型的数字
-
格式
long atol(char s[]);
- 数字默认十进制,如果加
0x
则为十六进制 - 前面的空格不被读取
-
帮助文档
-
代码示例
long v1; long v2; v1 = atol("2354"); v2 = atol(" 0xFF"); //开头的空格不读取 write("%d,%d",v1,v2); //输出:2354,255
- 参考链接:其他转换
帮助文档中关于string的函数
多看帮助文档,救赎之道就在其中