2017-04-08 52 views
0

如何處理可變數量的scanf輸入? 我正在掃描命令,其中一些是1.字命令,但一些需要數字參數。 scanf是否允許以下​​內容?可變的scanf輸入

scanf(" %s %d", command, argument); 

如果只輸入一個值,會忽略「參數」嗎? 另一種選擇我雖然之一是

scanf(" %s", command) 
if (strcmp(command, "somethin") { 
     scanf("%d", argument); } 

但是,這將創建一個新行權?終端必須以「>命令參數」 的形式接收輸入,我的問題是,如何解決具有可變數量輸入的問題。

+2

第一個將等待你輸入一個參數。用'fgets()'讀一行,然後用'sscanf()'來解析它。 – Barmar

+2

您也可以閱讀該行,然後使用'strtok()'將其分割爲令牌,然後解析。 – Barmar

+1

你幾乎肯定要讀整行然後處理該行 –

回答

2

不,它不會「創建換行符」。 scanf完全不知道任何換行符。 scanf將輸入流視爲由空格分隔的數據的線性序列。 Newline只是空白,與其他任何空白都沒有什麼不同。可以「看到」換行符的唯一scanf格式說明符是%c%[]。您的%s%d完全不符合新行。

這意味着你的第二個例子是正確的(在scanf的自然限制內)。它不會「創建新行」。如果你在一行提供輸入(如somethin 42),它將讀取一行。

您可能會遇到「相反」的問題:如果用戶忘記在一行中輸入所需參數,則下一個scanf將在下一行等待它。並在下一行。並在下一行......直到用戶終於提供它。我不確定這種行爲是否適合你。如果不是,那麼更好的辦法是通過fgets使用專用的基於行的輸入,然後手動解析該行。

P.S.沒有理由在空格前面加上%s%d

+0

fgets是否從指定文件讀取? –

+0

嗯,其實我現在試過了,它實際上有點怪異。它設法逃脫並且無限循環。它忽略了「如果」測試,只是簡單地忽略了我輸入的命令,而收益基本上會影響輸入。編輯:nvm修復它。錯誤地處理了strcmp輸入。 –

+3

@ZergOvermind'fgets'從流中讀取。你可以指定'stdin'作爲那個流。實際上,'scanf'實質上只是'fscanf(stdin,...'的縮寫 – AnT