C strtok:获取分隔符之前的值,而不仅仅是分隔符之后的值

C strtok:获取分隔符之前的值,而不仅仅是分隔符之后的值,c,strtok,C,Strtok,我试图在C语言中将字符串拆分为不同的部分。在C语言中,我只是使用了split(),它创建了一个数组来轻松访问拆分字符串的每个部分。现在,在C语言中,我试图像这样拆分字符串:“STXS1-21 | S2-23ETX”。我只想得到数字21和23。如果我使用分隔符字符串“STX-| ETX”,据我所知,我会得到: S1-21 | S2-23ETX 21 | S2-23ETX S2-23ETX 23ETX 但是,我试图单独获得数字21和23,那么我该如何实现呢?在您的具体示例中,您可以这样做: #inc

我试图在C语言中将字符串拆分为不同的部分。在C语言中,我只是使用了
split()
,它创建了一个数组来轻松访问拆分字符串的每个部分。现在,在C语言中,我试图像这样拆分字符串:
“STXS1-21 | S2-23ETX”
。我只想得到数字21和23。如果我使用分隔符字符串
“STX-| ETX”
,据我所知,我会得到:

  • S1-21 | S2-23ETX
  • 21 | S2-23ETX
  • S2-23ETX
  • 23ETX

  • 但是,我试图单独获得数字21和23,那么我该如何实现呢?

    在您的具体示例中,您可以这样做:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void) {
        char str[] = "STXS1-21|S2-23ETX";
        char *sptr = str;
        while (sptr = strchr(sptr, '-'))
            printf("%d\n", atoi(++sptr));
        return 0;
    }
    

    由于你没有提供你的代码,我不得不猜测它是

    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
        char s[] = "STXS1-21|S2-23ETX";
        const char *d = "-|ESTX";
        char *p;
    
        for (p = strtok(s, d);  p;  p = strtok(NULL, d))
            puts(p);
    
        return 0;
    }
    
    输入字符串中的四个数字。如果这些都是可以预测的,跳过它们就行了

    记住
    strtok
    手册页中的警告:

    漏洞 使用这些功能时要小心。如果您确实使用了它们,请注意:

    • 这些函数修改它们的第一个参数
    • 这些函数不能用于常量字符串
    • 定界字节的标识丢失
    • strtok()
      函数在解析时使用静态缓冲区,因此它不是线程安全的。如果这对您很重要,请使用
      strtok\u r()

    对于初学者,最好通过阅读更新您对strtok的知识。不过,为什么不编写一个完整的自定义函数呢?您似乎只对
    -
    后面的所有数字感兴趣。是否必须使用
    strok
    ?在这种情况下,正则表达式可能是更好的选择。
    #include <string.h>
    #include <stdio.h>
    
    int main()
    {
        char s[] = "STXS1-21|S2-23ETX";
        const char *d = "-|ESTX";
        char *p;
    
        for (p = strtok(s, d);  p;  p = strtok(NULL, d))
            puts(p);
    
        return 0;
    }
    
    1
    21
    2
    23