【CAPL】常见的字符串处理函数

大纲

  • image

格式化字符串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
      image
  • 代码示例
    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);
    }
    
  • 结果:

    image

字符串拼接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:本质上还是指定被替换字符串,通过起始位置和长度来指定
  • 帮助文档

    image
  • 代码示例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中间
  • 帮助文档

    image
  • 代码示例

    • 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);赋值给变量会报错
  • 帮助文档

    image
  • 代码示例

    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
  • 帮助文档

    image
  • 代码示例

    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()

帮助文档中关于string的函数

多看帮助文档,救赎之道就在其中

image
image

TBD

posted @ 2025-08-18 12:56  anliux  阅读(150)  评论(0)    收藏  举报