getchar函數的功能是從輸入流讀取一個字符,這是我們要明確的就是:
我們在控制台需要輸入至少兩個字符才能保證這個函數的執行:
例如:
源程序:
char ch;
ch = getchar();
我們需要在標准輸入流裡面輸入 ”w 回車“,就是需要至少輸入兩個字符,一個是接受的正常字符,另一個就是回車換行符,這個回車符的作用就有些像觸發器,只要輸入了回車符源程序就會進行一次執行,如果在輸入流中一次輸入了足夠多的數,那麼以後就不用輸入了,因為源程序裡面的所有接受輸入流的函數都會自動從這個輸入流緩沖區裡面讀取數據。
比如baidu一位網友問的問題,非常好:
[html]
<SPAN style="FONT-SIZE: 12px">scanf("%c",&a); // 向a輸入一個字符
gets(b); //向b輸入一個字符串
gets(c); //向c輸入一個字符串
當我輸入一個字符到a後,回車
怎麼會直接跳到輸入字符串c
我調試看了下,它會自動在a輸入完後,向b輸入字符'\0'
這是為什麼了??</SPAN>
scanf("%c",&a); // 向a輸入一個字符
gets(b); //向b輸入一個字符串
gets(c); //向c輸入一個字符串
當我輸入一個字符到a後,回車
怎麼會直接跳到輸入字符串c
我調試看了下,它會自動在a輸入完後,向b輸入字符'\0'
這是為什麼了??
原因就是,開始的時候輸入了兩個字符,回車符觸發了程序的運行,當程序讀完第一個字符後,就把第一個字符賦值給了 scanf函數,接著那個回車符就被gets(b)讀去了,再接著緩沖區空了,這是就自然又要用戶從輸入流中輸入字符並以回車結束。
getchar函數和scanf函數一樣。
目前我知道的解決的辦法有兩個:
1 可以在這兩個函數後面 加一個讀取那個回車符的函數,getchar();
2 如果是scanf()函數可以 直接寫讀入回車符 scanf("%c\n",&a);主要是添加 格式字符串後面的那個 \n。至於原理現在我還說不太清,但感覺可能是 兩個換行符同時出現所以編譯器自動消掉了一個吧。此問題還在探索中。。。