所以我的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);
}
答案 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。