【问题标题】:Parse Tokens from a String using strtok()使用 strtok() 从字符串中解析标记
【发布时间】:2015-06-26 22:03:27
【问题描述】:
char line[] = "COPY\tSTART\t0\tCOPY";
char *tmp;

tmp = strtok(line, "\t");
printf("%s", tmp);

这段代码的输出是COPY。而当

char line[] = "\tSTART\t0\tCOPY";

输出是START

但是!我想检查字符串 START 前面是否有任何内容。 那就是我认为\t 是第一个分隔符,所以strtok(line, "\t") 的输出是NULL。 但真正的输出是START

有什么误会吗?我能做什么?

【问题讨论】:

  • 不清楚您要做什么?
  • 将跳过从字符串开头开始的分隔符。你可以用strsep 代替""

标签: c string parsing strtok


【解决方案1】:

根据strtok()man page (强调我的)

解析字符串中的两个或多个连续分隔符字节的序列被认为是单个分隔符。 字符串开头或结尾的分隔符字节被忽略。 换句话说:strtok() 返回的标记总是非空字符串。

所以,您所体验的是strtok() 的正确行为。

OTOH,如果没有更多标记,strtok() 将返回 NULL,因此正如您所料,为初始分隔符返回 NULL 将传达错误消息,并且会造成混淆。所以,底线是,

  • 如果存在令牌

    strtok() 返回的标记总是非空字符串。

  • 如果令牌不存在

    strtok() 将返回 NULL。

注意:在使用返回的 token 之前,请务必检查是否为 NULL。

【讨论】:

    【解决方案2】:

    我能做什么?

    构建自己的函数,不完全是 strtok 的工作原理,但你可以得到一些想法:

    #include <stdio.h>
    #include <string.h>
    
    char *scan(char **pp, char c)
    {
        char *s, *p;
    
        p = strchr(*pp, c);
        if (p) *p++ = '\0';
        s = *pp;
        *pp = p;
        return s;
    }
    
    int main(void)
    {
        char line1[] = "COPY\tSTART\t0\tCOPY";
        char line2[] = "\tSTART\t0\tCOPY";
        char *p;
    
        puts("Line 1");
        p = line1;
        while (p) {
            printf("%s\n", scan(&p, '\t'));
        }
        puts("Line 2");
        p = line2;
        while (p) {
            printf("%s\n", scan(&p, '\t'));
        }
        return 0;
    }
    

    输出:

    Line 1
    COPY
    START
    0
    COPY
    Line 2
    
    START
    0
    COPY
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多