上午在做華為的編程題過程中遇到了連續輸入多行指令的問題,比如連續輸入以下指令到一個結構數組中:
U 1 5 (Enter)
Q 3 6 (Enter)
程序總是把(Enter)輸入到Q的對應的結構體的位置,於是在晚上找到了關於”用getchar吃回車“的解決辦法,從而解決了這個問題。
另外,學習數據結構以后的體會是,之前遇到的稍微棘手點兒的編程問題,現在可以用數據結構輕而易舉地解決了,so,數據結構與算法,可謂內功中的基本功,好比少林武術中的扎馬步吧,根基中的根基,以后需多加練習,切忌收到眼底,因為,有些問題只有在實踐中才可以發現並解決之,否則只是紙上談兵。
好,下面一則博文將的“用getchar()吃回車”的問題相對比較清楚,值得親自動手去試一試。
轉載網址:http://blog.csdn.net/chenglibin1988/article/details/8755626
getchar函數的功能是從輸入流讀取一個字符,這是我們要明確的就是:
我們在控制台需要輸入至少兩個字符才能保證這個函數的執行:
例如:
源程序:
char ch;
ch = getchar();
我們需要在標准輸入流里面輸入 ”w 回車“,就是需要至少輸入兩個字符,一個是接受的正常字符,另一個就是回車換行符,這個回車符的作用就有些像觸發器,只要輸入了回車符源程序就會進行一次執行,如果在輸入流中一次輸入了足夠多的數,那么以后就不用輸入了,因為源程序里面的所有接受輸入流的函數都會自動從這個輸入流緩沖區里面讀取數據。
比如baidu一位網友問的問題,非常好:
- <span style="font-size:12px;">scanf("%c",&a); // 向a輸入一個字符
- gets(b); //向b輸入一個字符串
- gets(c); //向c輸入一個字符串
- 當我輸入一個字符到a后,回車
- 怎么會直接跳到輸入字符串c
- 我調試看了下,它會自動在a輸入完后,向b輸入字符'\0'
- 這是為什么了??</span>
原因就是,開始的時候輸入了兩個字符,回車符觸發了程序的運行,當程序讀完第一個字符后,就把第一個字符賦值給了 scanf函數,接着那個回車符就被gets(b)讀去了,再接着緩沖區空了,這是就自然又要用戶從輸入流中輸入字符並以回車結束。
getchar函數和scanf函數一樣。
目前我知道的解決的辦法有兩個:
1 可以在這兩個函數后面 加一個讀取那個回車符的函數,getchar();
2 如果是scanf()函數可以 直接寫讀入回車符 scanf("%c\n",&a);主要是添加 格式字符串后面的那個 \n。至於原理現在我還說不太清,但感覺可能是 兩個換行符同時出現所以編譯器自動消掉了一個吧。此問題還在探索中。。。