2016-10-03 67 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