对于刷oj时因为scanf()出现wa而cin却AC的详解 【scanf() 和 cin 详解】
故事還得從昨天講起,昨天做了一道題及其的詭異,用cin輸入AC了。用scanf()卻一直的報錯或者陷入了
 死循環。這讓我很費解,我用了fflush(stdin)來排除,發現沒有效果。后來我想起之前寫過關于scanf()的原理詳解的文章。
 又看了一看才猛然發現了其中的原理。
c語言scanf()函數的原理
問題描述
隨便的舉個例子:
 輸入一個5x5的字符矩陣,然后讓你原樣輸出
 
 我們在做題的時候,有時候會遇到上面的那種多行的輸入,我們一般為了方便的調試看我們的代碼。
 一般習慣直接復制案例,然后粘貼到我們的控制它窗口。
 例如:
 
 你會看到用cin讀取的時候,我們的輸出和輸入是一模一樣的。
 接下來看一下用scanf()會發生什么。
 
 這TM的是什么鬼?
 接下來看一下原理解析。
原理解析
 首先,要明白的一點就是我們在輸入的時候,輸入的數據并不會立刻的賦值,而是進入了一個緩沖區。
 然后我們從緩沖區里挨個的提取然后賦值。
 當我們從鍵盤輸入字符串的時候需要敲一下回車鍵才能夠將這個字符串送入到緩沖區中,
 那么敲入的這個回車鍵(\r)會被轉換為一個換行符\n。
 對于: cin
當cin>>從緩沖區中讀取數據時,若緩沖區中第一個字符是空格、tab或換行這些分隔符時,cin>>會將其忽略并清除,繼續讀取下一個字符,若緩沖區為空,則繼續等待。但是如果讀取成功,字符后面的分隔符(換行)是殘留在緩沖區的,cin>>不做處理。
 那么根據上面cin讀取的概念換行符會省略過去,讀取的過程是這樣的。
 
 那么此時緩沖區里還有的內容是:
 
 究竟緩沖區里有沒有換行符我們來實驗一下就知道了。
 
 觀察一下: a=getchar()我們是沒有輸入的,你可以看到它已經直接從緩沖區里拿了字符,且是一個換行。
那么如果我們再 a=getchar()前 fflush(stdin)清空緩沖區一下,我們就得輸入了。
 
 從上圖,你會發現當我們fflush(stdin)清空緩沖區后,此時得緩沖區已經沒有東西了,那么我們就得輸入了。
對于: scanf()
scanf()它是可以控制參數的,且scanf對不同的參數表現出來的特性不一樣。當參數是 %d %lf %f %s 等,只要不是%c它都是省略空格,換行等一些空白符的。但是對于%c它就可以讀取空白符例如: 換行,空格等。
 那么根據上面scanf()讀取的概念,讀取的過程是這樣的。
 
 scanf("%c")會將換行也一起讀取,于是就產生了最上面的問題。
那么此時的緩沖區有:
 
 還是用上面的方法實驗一下:
 
 你會發現此時的緩沖區確實有4個E 還沒有讀取。
最后
 好了,終于真相大白。我是輝小歌,你可以叫我小歌。一個菜鳥程序員。
 如果本文對你有幫助的話,請點贊,關注,加收藏。我們下次再見。
 ps: 還是第一次拉票。
總結
以上是生活随笔為你收集整理的对于刷oj时因为scanf()出现wa而cin却AC的详解 【scanf() 和 cin 详解】的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: is_sorted() 函数---一个判
- 下一篇: 第三届“传智杯”全国大学生IT技能大赛(
