#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...