2015-06-16 86 views
-1

我HEVE一個下面的代碼什麼是選項scanf vs獲取vs fgets?

while (a != 5) 
scanf("%s", buffer); 

這種運作良好,但不採取任何空間中提到的詞與詞之間,或者換句話說,scanf函數結束。如果我們用空格來掃描

如果我用這個

while(a != 5) 
scanf("%[^\n]", buffer); 

它只能一次是壞

我從來沒有使用gets()因爲我知道有多少討厭我t是..

我最後的選擇是這個

while(a != 5) 
    fgets(buffer, sizeof(buffer), stdin); 

所以我的問題是

  1. 爲什麼第二個命令是不是在循環內的工作?
  2. 我有什麼其他選項掃描字符串與空格?
+1

什麼是'a'?它在哪裏改變?初始值是什麼?你想做什麼? – harald

+0

我會去的第三個選項,然後修剪換行符如圖所示[這裏](http://stackoverflow.com/a/28462221/3386109) – user3386109

+0

在所有3種情況下,檢查scanf函數的'的返回值()/在使用'buffer'之前,必須使用fgets()'。 – chux

回答

1

"%[^\n]"將嘗試掃描一切,直到換行。輸入中的下一個字符是\n,所以你應該跳過它來到下一行。

嘗試:"%[^\n]%*c"%*c將丟棄下一個字符,這是換行符字符。

+0

'「%[^ \ n]」'有問題。嘗試僅輸入一個換行符 - 「緩衝區」不會改變,保持原樣 - 可能未初始化。 '%[^ \ n]%* c「' – chux

+0

好的問題?但假設是有文本需要處理,所以無關緊要。 – AzNjoE

1

爲什麼第二個命令不循環

監守內工作,首次你掃描直到\n,該\n在輸入緩衝器剩餘。你需要吃掉(換句話說,放棄)緩衝區中存儲的換行符。您可以利用while (getchar()!= \ n );完成該項工作。

有什麼其他的選擇,我必須用空格掃描字符串?

那麼,你幾乎在那裏。您需要使用fgets()。利用這一點,你可以

  1. 要由緩衝區溢出的安全(克服gets()限制)
  2. 空間輸入字符串(克服%s限制)

但是,請記住, fgets()讀取並存儲尾隨的換行符,因此您可能想要刪除它,並且必須手動執行該操作。

+0

對不起兄弟我的錯,第三個功能是不FSCANF,其與fgets only..a簡單的拼寫錯誤... –

+0

'scanf()的'+'%s'也有同樣的問題,因爲#1。 – cremno