問題二問題三
問題四補充:
是通用終端格式化輸入函式,它從標準輸入裝置(鍵盤) 讀取輸入的資訊。可以讀入任何固有型別的資料並自動把數值變換成適當的機內格式。
其呼叫格式為: scanf(「《格式化字串》」,《位址表》);
scanf()函式接收輸入資料時,遇以下情況結束乙個資料的輸入:(不是結束該scanf函式, scanf函式僅在每乙個資料域均有資料,並按回車後結束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。
如何讓scanf()函式正確接受有空格的字串?如: i love you!
#include
intmain()
輸入:i love you
輸出:i
上述程式並不能達到預期目的。因為scanf掃瞄到」i」後面的空格就認為對str的掃瞄結束(空格沒有被掃瞄),並忽略後面的」 love you」。
原因:殘留的資訊 love you是存在於stdin流中,而不是在鍵盤緩衝區中。
#include
intmain
(void
)
鍵盤緩衝區殘餘資訊問題
#include
intmain
(void
)while
(c!=
'n');
return0;
}輸入:1
4輸出:a=
1 c=
4
scanf(「%c」, &c);這句不能正常接收字元。我們每敲一下」enter」鍵,向鍵盤緩衝區發去乙個「回車」(\r),乙個「換行」(\n),在這裡\r被scanf()函式處理掉(執行拿資料),而\n被scanf()函式「錯誤」地賦給了c。
fflush(stdin)
while(ch=getchar() != 『\n』)
#include
intmain
(void
)while
(c!=
'n')
;return0;
}
輸入:1 4
輸出:a=1 c=4
#include
intmain
(void
)while
(c !=
'n')
;return0;
}
輸入:1 4
輸出:a=1 c=4
「空格符」來處理緩衝區殘餘資訊的示例:
版本1:執行出錯的程式
#include
intmain
(void
)
版本2:使用了空格控制符後
include
intmain
(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也就正確的列印出來了。
輸入型別與格式化字串不匹配導致stdin流的阻塞
#include
intmain
(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
intmain
(void
)輸入:1 b 2
輸出:第一次讀入數量:1
輸入:136
輸出:第二次讀入數量:3
如何處理scanf()函式誤輸入造成程式死鎖或出錯
#include
intmain
(void
)
如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的型別,你的程式不是死鎖,就是得到乙個錯誤的結果
scanf()函式執行成功時的返回值是成功讀取的變數數,也就是說,你這個scanf()函式有幾個變數,如果scanf()函式全部正常讀取,它就返回幾。
但這裡還要注意另乙個問題,如果輸入了非法資料,鍵盤緩衝區就可能還個有殘餘資訊問題
#include
intmain
(void
)
fflush(stdin)這個方法在gcc下不可用。(在vc6.0下可以)
以下是 c99 對 fflush 函式的定義:
int fflush(file *stream);
如果stream指向輸出流或者更新流(update stream),並且這個更新流
執行的操作不是輸入,那麼fflush函式將把任何未被寫入的資料寫入stream
指向的檔案(如標準輸出檔案stdout)。否則,fflush函式的行為不確定。
scanf 函式慎重使用
在一般的 c 入門書籍中介紹輸入輸出函式時,總是會拿scanf和printf函式來舉例。這裡主要說下scanf函式的一些事情。1.標頭檔案 scanf與printf函式一樣,都被定義在標頭檔案stdio.h裡,因此在使用scanf函式時要加上 include 2.函式原型 int scanf con...
關於Scanf函式的使用!
這裡講一下我自己在程式設計過程中的例子 2.截圖太麻煩,直接打程式了 應當注意的是 如果在 格式控制字串 中除了格式宣告外還有其他字元,那麼需在輸入資料時對應的位置上字元要保持一致 例如scanf a f,b d n a,b 則需輸入a 1,b 2 而不是直接輸入1 2,會導致錯位結果不理想 3.當...
使用scanf函式遇到的問題
用c語言寫乙個程式,實現線性列表的一些操作,輸入相應的命令執行相對的操作,為了簡潔主要的命令有建立列表命令c 列印列表命令p,退出程式命令e。如下 list.h 標頭檔案 typedef struct node 這裡的list是乙個student結構體列表 list list create void...