1

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

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);
4

5 回答 5

5

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

任何'\0'字符串'\0'都可以

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

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

于 2011-07-12T14:21:37.690 回答
1

请看一下这里给出的例子:MSDN: strtok, wcstok, _mbstok

于 2011-07-12T14:20:24.507 回答
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 修改它传递的字符串,所以如果你想重新解析它,你需要再次复制它。

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

于 2011-07-12T14:22:26.003 回答
1

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

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

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

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

于 2011-07-12T14:22:39.863 回答
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().

于 2011-07-12T14:26:30.227 回答