代碼如下:
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