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