深入理解C/C++標準輸入輸出,cin、scanf、getchar()、文件結束符EOF等常見問題詳解

問題1:爲什麼我用while(cin>>a)一直跳不出循環?(cin的">>"函數返回值是什麼?)

問題描述:《C++ primer》上也出現過類似如下代碼,然後自己在控制檯輸入數據,一直輸入都跳不出循環。

int a;
while(cin>>a){
}

原因:cin是一個類,沒有返回值,while判斷條件其實是在判斷">>“函數的返回值。”>>“是一個被重載過的運算符,這個重載函數的返回值類型爲istream&,返回值通常就是輸入流cin本身,如果沒有遇到錯誤輸入或者文件末尾(EOF),cin就一直有效,當然就跳不出while循環。當你在鍵盤上輸入Ctrl+Z,再按Enter鍵,就等同於輸入遇到了文件末尾EOF,遇到EOF後,”>>"函數的返回值是0,就能結束while循環了。

.
.

問題2:scanf的返回值是什麼?(EOF是什麼類型的數據,值是多少?)

問題:while(scanf("%d %d",&a,&b)){ }爲何是死循環?遇到文件結束符EOF也跳不出循環?
原因:scanf是函數,這和cin不同,cin是一個類,而">>“是cin類中的函數。scanf返回的是成功輸入數據的個數,例如scanf(”%d %d",&a,&b)成功輸入兩個數,返回值就是2,scanf("%d",&a)成功輸入一個數,返回值就是1。當遇到文件末尾時,scanf函數返回值是EOF。
EOF是一個宏,標準規定EOF必須是一個int類型的負數,編譯器通常令EOF的值爲-1。因此,想要跳出循環,要寫成while( scanf("%d %d",&a,&b) !=EOF){ }。

.
.

問題3:爲什麼我cin只輸入1個或幾個數,在鍵盤上輸入了多個(超過幾個)數之後,控制檯輸入界面仍然不停止?(輸入的數據什麼時候纔會進入緩衝區?)

問題描述:例如以下代碼,明明只用cin輸入2個數,在鍵盤上輸入數據空格重複多次仍要繼續輸入。
輸入示例:1空格2空格3空格4空格5回車

int a,b;
cin>>a>>b;

原因:調用cin的">>“函數時,程序就等着用戶按鍵,直到用戶按下回車鍵,包換換行符在內的這一行數據才被放入緩衝區中,形成輸入流,提取符”>>"才能從中提取數據。也就是說,沒按下回車鍵之前,你在鍵盤上輸入的數據都還沒被放入緩衝區只是在控制檯上顯示出你按下的數據了而已,這也是爲什麼我們輸錯了的時候還能按退格鍵刪除數據然後重新輸入。
以上面程序爲例,當你在鍵盤上輸入了超過2個字符時,其他字符也會被保留在緩衝區中,等待後面程序中的cin>>讀取,若後面程序中再出現cin>>c之類的,程序也不會出現控制檯等待用戶輸入,而是直接讀取緩衝區中剩下的數據,直到緩衝區中的字符讀完後,纔等待用戶按鍵。

.
.

問題4:使用getchar()函數,我明明輸入的是數字1,怎麼輸入的是49?(getchar()函數的返回值是什麼?)

:getchar()函數會從stdin中讀入一個字符(空格回車等空白符它也不會跳過,通通都讀),並返回一個int型數據,返回的是輸入字符的ASCII碼。也就是說,你輸入數字1,它返回的是數字1的ASCII碼49,你輸入字符A,它返回的是字符A的ASCII碼65,你輸入空格,它返回的是空格的ASCII碼32。hehehe,一般都是用getchar()來判斷是否已經到了一行末尾,因爲它換行符也讀。
以下爲getchar()函數實測
在這裏插入圖片描述
我在鍵盤輸入的是:3空格AB空格7空格1空格2回車,可以看到scanf輸入的3輸出也是3,getchar把空格也讀進來了,並且輸出空格的ASCII碼32。

在這裏插入圖片描述

五:在大多數場合,用scanf和printf是真的比cin和cout快,親測。
但是scanf和printf用着麻煩啊,每次還要自己寫輸入輸出類型%c%f%d什麼的,而cin和cout的">>"、"<<"都是被重載過的運算符,可以讀入或輸出各種類型的數據,用着真是爽。

這就是“深入理解C/C++標準輸入輸出”???我.厚顏無恥.真,只是爲了寫個像那麼回事的題目。以上都是我的粗淺理解,若有誤,望批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章