为什么strtok没有正确分离令牌?

时间:2013-05-23 07:22:02

标签: c string strtok

我正在尝试调整以下工作代码:

http://www.cplusplus.com/reference/cstring/strtok/

如下:

#include <stdio.h>
#include <string.h>

int main (int argc, const char * argv[]) {

    char input[10];   
    scanf("%s", input);
   char * pch;
   pch = strtok(input, " ");

 while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok(NULL, " ");
  }   

   return 0;
}

如果我输入

test string to tokenize

我才回来

test

我做错了什么?

4 个答案:

答案 0 :(得分:4)

%s转换在第一个空格处停止。

在上面调用strtok()之前打印字符串;它只会是"test"

另外,正如@Paul R所指出的,您需要考虑您正在使用的缓冲区大小。 10个字符非常小。

答案 1 :(得分:2)

尝试在char[10]中存储字符串“test string to tokenize”将导致缓冲区溢出。之后,任何事都可能发生。增加input

的大小
char input[256];

此外,正如@H2CO3所述,您应该使用fgets(...)而不是scanf("%s", ...),以避免出现空白问题。

答案 2 :(得分:2)

scanf("%s", input);

有几个问题:

  1. %s转换说明符会使scanf()扫描到第一个空格。您在缓冲区中获得的只是test

  2. test string to tokenize不适合10个字符。

  3. 使用fgets()代替适当大小的缓冲区:

    char buf[LINE_MAX];
    fgets(buf, sizeof(buf), stdin);
    

    另一条建议:使用strtok_r()代替strok(),它更安全。

    char *endp;
    char *p = strtok_r(buf, " ", &endp);
    while (p) {
        puts(p);
        p = strtok_r(NULL, " ", &endp);
    }
    

答案 3 :(得分:0)

scanf("%s", input);

这会在遇到空格或\n之前接受输入。实际上,您只需将“test”作为参数输入strtok

您需要使用类似getline的内容来输入带空格的行。

另外,正如其他人所指出的,你的缓冲区可能会溢出。