strtok()问题获取字符串的第一个标记

时间:2011-07-12 14:14:33

标签: c strtok

以下代码无法获取字符串的第一个标记:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");

printf("%c", p1);

5 个答案:

答案 0 :(得分:5)

strtok()实际上用文字'\ 0'替换分隔符 - 实际上是用原始字符串写的。第二次拨打strtok(array, "");时,array现在看起来像是

任何'\ 0'STRING'\ 0'WOULD DO

(例如,如果你要打印字符串,你只会看到“ANY”)

由于strtok不会超出字符串的结尾,因此您只能第二次获得一个标记,并且对strtok(NULL, " ");的调用将返回NULL。要解决您的问题,您需要将字符串复制到另一个位置以进行第二组操作,或者保存临时字符串指针。

答案 1 :(得分:1)

请查看此处给出的示例:MSDN: strtok, wcstok, _mbstok

答案 2 :(得分:1)

这样可行:

char *p1;
char array[100];
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");
p1 = strtok(NULL, " ");
strcpy(array, "ANY STRING WOULD DO");
p1 = strtok(array, " ");

printf("%s", p1);

strtok修改它传递的字符串,所以如果你想重新解析它,你需要再次复制它。

如果您只想保留令牌,只需复制指针即可。

答案 3 :(得分:1)

请记住strtok通过在每个令牌后放置'\0'个字符来修改字符串。

因此,当您再次尝试对相同的字符串进行标记时,您实际上只是为第一个标记进行了标记。

这将导致第二个p1 = strtok(NULL, " ");将返回NULL,然后当您尝试打印p1时,它会尝试取消引用NULL,并且可能会失败。

请注意,您需要使用"%s"而不是"%c",因为您正在打印字符串,而不是字符。

答案 4 :(得分:1)

strtok()实际上通过在找到令牌结尾时向其添加零终止符('\ 0')来修改您要查找令牌的字符串。因此,在迭代之后,它不再是内存中的连续字符串了。这就是为什么你不能在开始时重新开始并重新解析字符串的标记。

您可能有两种选择:

  • 首先制作字符串的副本,然后将其标记为

    char *p1; char array[100]; strcpy(array, "ANY STRING WOULD DO");
    
    char tmp[100];
    strcpy( tmp, array );
    p1 = strtok(tmp, " ");
    p1 = strtok(NULL, " ");
    
    strcpy( tmp, array );
    p1 = strtok(tmp, " ");
    p1 = strtok(NULL, " ");
    
    printf("%c", p1);
    
  • 或者您可以在找到它们时保留指向单独标记的指针数组并重新使用数组,而不是重新调用strtok()