2013-02-27 63 views
1
scanf("%s %d %s %d",word1,&num1,word2,&num2); 

所以當用戶輸入「quit」時,它應該停止詢問其他3個輸入。然而它要求我輸入另一個「退出」,可能是因爲格式中有2%s如何讓多個輸入的scanf()忽略其他?

反正這裏有嗎? 編輯:因爲它必須在循環中獲得4個輸入,除非輸入退出。

+0

你可以有一個更奇特的輸入解析。也許你可以用'flex' +'bison'或'antlr'? – 2013-02-27 19:22:10

+2

@BasileStarynkevitch人們可以理解爲什麼你建議只有在看到你的個人資料並發現你是GCC核心黑客時,才能爲4個字的用戶輸入編寫一個完整的LALR解析器:P – 2013-02-27 19:24:06

+0

並不是說只有4個不同的用戶輸入文字.... – 2013-02-27 19:26:47

回答

3

scanf是一種非常生硬的工具,不擅長說話的非結構化輸入(包括人類:-))。一般來說,如果您正在與某個人互動,您應該從fgets開始閱讀一行,然後選擇最後一行,但最方便,可能包括sscanf

這比你想象的要糟糕,因爲%d指令會給你提供一些不可掃描的東西作爲整數。例如,如果您輸入quit now,則第一個%s指令將讀取單詞quit,但%d將在輸入流中保留now,導致scanf返回1(一次成功的轉換和分配)。讀取字符串的下一次嘗試將獲取並使用now;到幼稚的代碼,這看起來像是後面的第二條輸入行,而不是第一條輸入行的延續。

+1

+1提及'scanf()'不起作用,我們認爲它的確如此。例如,也許你可以建議一個替代方案,例如'fgets()'。 – 2013-02-27 19:37:02

+1

@ H2CO3:第二行建議以'fgets'開頭。 :-) – torek 2013-02-27 19:58:56

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

scanf("%s ", word1); 
if (strcmp(word1, "quit") != 0) 
    scanf("%d %s %d", &num1, word2, &num2);