scanf常見的注意問題

2021-08-18 14:59:01 字數 2396 閱讀 6393

#include 

int main()

輸入:i love you

輸出:i

上述程式並不能達到預期目的。因為scanf掃瞄到」i」後面的空格就認為對str的掃瞄結束(空格沒有被掃瞄),並忽略後面的」 love you」。

原因:殘留的資訊 love you是存在於stdin流中,而不是在鍵盤緩衝區中。

#include

int main(void)

#include

int main(void)

while(c!='n');

return0;}

輸入:1

4輸出:a=1 c=

a=4 c=

scanf(「%c」, &c);這句不能正常接收字元。我們每敲一下」enter」鍵,向鍵盤緩衝區發去乙個「回車」(\r),乙個「換行」(\n),在這裡\r被scanf()函式處理掉(執行拿資料),而\n被scanf()函式「錯誤」地賦給了c。

#include

int main(void)

while(c!='n');

return0;}

輸入:1

4輸出:a=1 c=4

#include

int main(void)

while (c != 'n');

return0;}

輸入:1

4輸出:a=1 c=4

版本1:執行出錯的程式

#include

int main(void)

版本2:使用了空格控制符後

includeint main(void)

執行第乙個版本(錯誤的程式)

我們輸入:

0 1 2 3 4 5 6 7 8 9

結果是乙個空字元

再執行第二個版本(正確的程式)

同樣輸入:

0 1 2 3 4 5 6 7 8 9

這一次就顯示字元9,故此程式正確。

結論:就是%前面的空格在起作用,「scanf()的格式控制串可以使用空白字元或其它非空白字元,使用空白字元會使scanf()函式在讀操作中略去輸入中的零個或多個空白字元。」

所以在%前面加上了空格(空格屬於空白字元,此外還有像製表符等也屬於空白字元),在輸入過程中,將略去輸入中的乙個或多個空白字元,所以我們輸入的0 1 2 3 4 5 6 7 8 9這些字元中的空白字元就被略去了,字元9也就正確的列印出來了。

#include

int main(void)

輸入:1 b 2

輸出:第一次讀入數量:1

輸入:6

輸出:第二次讀入數量:3

執行到第乙個scanf函式時,由於輸入』b』的原因scanf函式直接返回1,stdin流阻塞。

執行到第二個scanf函式時,字元』b』與格式化字串」%c%d%d」中的%c匹配,stdin流終於疏通,在輸入6,則將變數a,b,c分別賦值為98(『b』的ascii碼)、2、6,scanf函式返回3。

scanf函式後正確使用fflush(stdin);,清空輸入緩衝區

#include

int main(void)

輸入:1 b 2

輸出:第一次讀入數量:1

輸入:136

輸出:第二次讀入數量:3

#include

int main(void)

如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的型別,你的程式不是死鎖,就是得到乙個錯誤的結果

scanf()函式執行成功時的返回值是成功讀取的變數數,也就是說,你這個scanf()函式有幾個變數,如果scanf()函式全部正常讀取,它就返回幾。

但這裡還要注意另乙個問題,如果輸入了非法資料,鍵盤緩衝區就可能還個有殘餘資訊問題

#include

int main(void)

fflush(stdin)這個方法在gcc下不可用。(在vc6.0下可以)

以下是 c99 對 fflush 函式的定義:

int fflush(file *stream);

如果stream指向輸出流或者更新流(update stream),並且這個更新流

執行的操作不是輸入,那麼fflush函式將把任何未被寫入的資料寫入stream

指向的檔案(如標準輸出檔案stdout)。否則,fflush函式的行為不確定。

scanf 函式問題

今晚研究一下scanf函式 大部分內容 於c語言中文網中 c語言常見問題集 我只不過是做了綜合 1 首先,傳給scanf的必須是指標,對於每個值,scanf都會寫入指標所值的位置,所以必須加 在寫程式時候經常會忘記。2 scanf 函式的返回值反映的是按照指定的格式符正確讀入的資料的個數。如果輸入資...

Scanf函式的輸入問題

scanf 怎樣讀取輸入?scanf 開始讀取輸入以後,會在遇到的第乙個空白字元空格 blank 製表符 tab 或者換行符 newline 處停止讀取。假定使用了乙個 d說明符來讀取乙個整數。scanf 函式開始每次讀取乙個輸入字元,它跳過空白字元 空格 製表符和換行符 直到遇到乙個非空白字元。因...

scanf 堆疊破壞的問題

一段簡單的 使用char接收十六進製制字串,如下 string buf for int i 0 i以上 雖然能夠得到正確結果,但是執行提示堆疊破壞錯誤,在scanf處下斷點,觀察t1記憶體被寫入的情況,發現雖然定義的乙個位元組,但是寫入的是四個位元組,以上為問題產生的根源,查詢網路,有說將scanf...