scanf("%s %d %s %d",word1,&num1,word2,&num2);
所以當用戶輸入「quit」時,它應該停止詢問其他3個輸入。然而它要求我輸入另一個「退出」,可能是因爲格式中有2%s如何讓多個輸入的scanf()忽略其他?
反正這裏有嗎? 編輯:因爲它必須在循環中獲得4個輸入,除非輸入退出。
scanf("%s %d %s %d",word1,&num1,word2,&num2);
所以當用戶輸入「quit」時,它應該停止詢問其他3個輸入。然而它要求我輸入另一個「退出」,可能是因爲格式中有2%s如何讓多個輸入的scanf()忽略其他?
反正這裏有嗎? 編輯:因爲它必須在循環中獲得4個輸入,除非輸入退出。
scanf
是一種非常生硬的工具,不擅長說話的非結構化輸入(包括人類:-))。一般來說,如果您正在與某個人互動,您應該從fgets
開始閱讀一行,然後選擇最後一行,但最方便,可能包括sscanf
。
這比你想象的要糟糕,因爲%d
指令會給你提供一些不可掃描的東西作爲整數。例如,如果您輸入quit now
,則第一個%s
指令將讀取單詞quit
,但%d
將在輸入流中保留now
,導致scanf
返回1(一次成功的轉換和分配)。讀取字符串的下一次嘗試將獲取並使用now
;到幼稚的代碼,這看起來像是後面的第二條輸入行,而不是第一條輸入行的延續。
+1提及'scanf()'不起作用,我們認爲它的確如此。例如,也許你可以建議一個替代方案,例如'fgets()'。 – 2013-02-27 19:37:02
@ H2CO3:第二行建議以'fgets'開頭。 :-) – torek 2013-02-27 19:58:56
#include <stdio.h>
#include <string.h>
scanf("%s ", word1);
if (strcmp(word1, "quit") != 0)
scanf("%d %s %d", &num1, word2, &num2);
你可以有一個更奇特的輸入解析。也許你可以用'flex' +'bison'或'antlr'? – 2013-02-27 19:22:10
@BasileStarynkevitch人們可以理解爲什麼你建議只有在看到你的個人資料並發現你是GCC核心黑客時,才能爲4個字的用戶輸入編寫一個完整的LALR解析器:P – 2013-02-27 19:24:06
並不是說只有4個不同的用戶輸入文字.... – 2013-02-27 19:26:47