-1

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

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

4 回答 4

4

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

在调用它之前打印你的字符串strtok();这将是唯一"test"的。

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

于 2013-05-23T07:23:49.997 回答
2

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

char input[256];

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

于 2013-05-23T07:23:42.633 回答
2
scanf("%s", input);

这有几个问题:

  1. %s转换说明符进行扫描,scanf()直到第一个空格。你在缓冲区中得到的只是test.

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

改用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);
}
于 2013-05-23T07:27:13.640 回答
0
scanf("%s", input);

这需要输入,直到遇到空格或\n.Infact 您只输入“测试”strtok作为参数。

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

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

于 2013-05-23T07:27:06.003 回答