如何使用scanf函式?

2021-10-11 01:33:48 字數 3038 閱讀 4278

問題二問題三

問題四補充:

是通用終端格式化輸入函式,它從標準輸入裝置(鍵盤) 讀取輸入的資訊。可以讀入任何固有型別的資料並自動把數值變換成適當的機內格式。

其呼叫格式為: 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...