如果一個scanf的格式串以\n結尾,那么在讀取完后還會阻塞等待,比如:
int a;
scanf("%d\n", &a);
這種情況,輸入一個數字然后敲下回車后,程序還是阻塞着的。為什么呢?
在仔細讀了一遍《C程序設計現代方法》上的描述后,搞明白了。書上有這段描述:
處理格式串中的普通字符時,scanf函數采取的動作依賴於這個字符是否為空白字符。
-
空白字符。當在格式串中遇到一個或多個連續的空白字符時,scanf函數從輸入中重復讀空白字符直到遇到一個非空白字符(把該字符“放回原處”)為止。格式串中的一個空白字符可以與輸入中任意數量的空白字符相匹配,包括0個。
-
其它字符。當在格式串中遇到非空白字符時,scanf函數將把它與下一個輸入字符進行比較。如果兩個字符相匹配,那么scanf函數會放棄輸入字符而繼續處理格式串。如果兩個字符不匹配,那么scanf函數會把不匹配的字符放回輸入中,然后異常退出。
格式串中,由於遇到了空白字符'\n',因此還會“重復讀空白字符直到遇到一個非空白字符為止”,由於輸入緩沖已經沒有字符可讀了,因此將阻塞等待,直到讀入了一個非空白字符為止。
這個時候,如果繼續按下空格或者回車,程序還是會阻塞,直到輸入一個非空白字符為止。