2016-10-03 275 views
0

我有一个代码在这里有一些不必要的行为时,输入字符串与空格。例如print illegal_argument。当有多个单词输入时,我希望它只注册第一个单词。Scanf输入继续到下一个scanf

目前发生的是:

[email protected] $ print 0 
Enter router ID for information > ID: 0, flag: f7, model_length: 13, model: D-Link y6000 

它注册的第一print在命令循环的比较。但不是scanf提示用户输入下一个输入,而是忽略该输入,并且从前一个scanf获取用户输入的第二个单词/数字。

我希望发生的是:

[email protected] $ print 0 
Enter router ID for information > 0 
ID: 0, flag: f7, model_length: 13, model: D-link y6000. 

一切都会按计划,否则,但我不知道是否有做这个简单的方法。我试过使用Strtok,没有多少运气。

char input[256]; 
printf("%[email protected] $ ", getenv("USER")); 
scanf("%s", input); 

if(strcmp(input, "print") == 0) { 
    print(); 
} 

上面的代码是我如何从用户获得输入。

任何人有任何想法?

+2

当你想要整个输入行时,不要使用'scanf',而是使用'fgets'。 –

+0

@OlafDietsche尝试'fgets(input,256,stdin)'不起作用,除非我做错了什么。尝试'$ print'产生':command not found.'。 –

+0

@Christian S'fgets(输入,256,stdin)'工作。代码中的其他内容也需要更改。请参阅http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input – chux

回答

1

scanf()获得第一个输入值后,将其余部分留在输入流中。试试这个放弃剩余的字符:

int ch; 
while ((ch = getchar()) != '\n' && ch != EOF) 
    continue;    // discard remaining characters 

如果你把这些线下一个读之前,从stdin,多余的字符不会破坏你的输入。

+0

注意:在文件结束时while(getch()!='\ n')是一个无限循环。 – chux

+0

True @chux,但终端用户输入的一行总是以'\ n'结尾,不是吗? –

+0

“来自终端的输入始终以'\ n',” - > not _always_“结尾。行为是特定于实现的。 – chux