scanf的格式串中為何不應以\n結尾?


如果一個scanf的格式串以\n結尾,那么在讀取完后還會阻塞等待,比如:

int a;
scanf("%d\n", &a);

這種情況,輸入一個數字然后敲下回車后,程序還是阻塞着的。為什么呢?

在仔細讀了一遍《C程序設計現代方法》上的描述后,搞明白了。書上有這段描述:


處理格式串中的普通字符時,scanf函數采取的動作依賴於這個字符是否為空白字符。

  • 空白字符。當在格式串中遇到一個或多個連續的空白字符時,scanf函數從輸入中重復讀空白字符直到遇到一個非空白字符(把該字符“放回原處”)為止。格式串中的一個空白字符可以與輸入中任意數量的空白字符相匹配,包括0個。

  • 其它字符。當在格式串中遇到非空白字符時,scanf函數將把它與下一個輸入字符進行比較。如果兩個字符相匹配,那么scanf函數會放棄輸入字符而繼續處理格式串。如果兩個字符不匹配,那么scanf函數會把不匹配的字符放回輸入中,然后異常退出。


格式串中,由於遇到了空白字符'\n',因此還會“重復讀空白字符直到遇到一個非空白字符為止”,由於輸入緩沖已經沒有字符可讀了,因此將阻塞等待,直到讀入了一個非空白字符為止。

這個時候,如果繼續按下空格或者回車,程序還是會阻塞,直到輸入一個非空白字符為止。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM