为什么strtok会像scanf那样互动?

时间:2012-02-27 02:54:54

标签: c scanf strtok

所以我的shell项目一直在进行,但我最新的speedbump正在引入用户输入。我正在尝试对输入字符串进行标记,但在第一个标记strtok之后只返回NULL。但如果我在程序中硬编写字符串,一切都可以正常运行。我如何处理用户输入,以便strtok将整个字符串(而不是第一个)标记化?

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

int main ()
{
  char input[100];
  scanf("%s", input); //input entered is "echo 1 2 3 4"
  char *temp=strtok(input, " "); //this is "echo"
  printf("temp1: %s\n", temp);
  temp=strtok(NULL, " "); //this is (null)
  printf("temp2: %s\n", temp); 

}

2 个答案:

答案 0 :(得分:3)

问题在于scanf("%s"...)停止在第一个空格字符处读取并返回字符串。换句话说,scanf("%s"...)不会读取多个单词。

请参阅'%s':http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

scanf("%[^\n\r]", string_variable)可能是一个更好的主意。

更新:正如Seth在评论中所提到的,"%[^\n\r]"表示读取所有字符,直到遇到^之后的任何字符。

答案 1 :(得分:2)

请务必阅读您使用的功能文档。 %s格式说明符“将读取后续字符,直到找到空格(空格字符被视为空白,换行符和制表符)”。这意味着input只会保留字符串echo

有关如何正确读取文件中的行的信息,请参阅this answer