C語言:爲什麼scanf("%[^\n]",str);放在循環裏時會反覆輸出第一次輸入的字符串?

代碼如下:

while (1) {
    scanf("%[^\n]", str);
    printf("%s\n", str);
}

非常普通的一個輸入輸出邏輯,使用scanf("%[^\n]",str);的含義是讀入除回車符(\n)以外的所有字符。

這樣做的好處是我們可以讀入一行帶空格的字符串,輸入字符串完畢後回車即可賦值給str。

但當這個邏輯放入循環裏之後,輸入一行字符串,回車,就出現了神奇的事情:這個循環會一直輸出這同一個字符串

原因是這樣的:

%[^\n]的含義是“在找到換行符之前讀取包含任何字符的字符串”。換行符本身不被使用,找到換行符後,它會繼續留在輸入流中。所以在下一輪循環會自動再從輸入流中讀取輸入,並輸出。

所以問題的關鍵就是丟棄掉這一輸入流。

而%*c的含義是讀取一個字符,並將輸入流中的內容丟棄。

所以採用scanf("%[^\n]%*c", str);這種寫法,即可實現將一行字符串讀取,同時換行符會由%*c讀取,然後整個字符串會存入str所在的內存中,然後輸入流中的內容便會被丟棄,這樣下次循環就可以重新輸入了。

所以修改後如下:

while (1) {
    scanf("%[^\n]%*c", str);
    printf("%s\n", str);
}

最後是類似問題的解答:

https://stackoverflow.com/questions/31869628/why-ns-does-not-work-in-loop

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章