scanf 函式慎重使用

2021-06-28 15:14:22 字數 1339 閱讀 3141

在一般的 c 入門書籍中介紹輸入輸出函式時,總是會拿scanf和printf函式來舉例。這裡主要說下scanf函式的一些事情。

1. 標頭檔案

scanf與printf函式一樣,都被定義在標頭檔案stdio.h裡,因此在使用scanf函式時要加上

#include 。

2. 函式原型

int scanf(const char *format,...);
函式 scanf() 是從標準輸入流stdio (標準輸入裝置,一般是鍵盤)中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應位址的變數中。

3. 返回值

scanf()函式返回成功賦值的資料項數,讀到檔案末尾出錯時則返回eof。如

scanf("%d%d",&a,&b);
如果a和b都被成功讀入,那麼返回值就是2;如果只有a被成功讀入,返回值為1;如果a和b都未被成功讀入,返回值為0;如果遇到錯誤或遇到end of file,返回值為eof。

為什麼要慎用scanf()呢?

首先,是輸入格式要求高。在輸入流中,資料項必須由空格製表符新行符分割。逗號和分號等不是分隔符,比如上面的**,將接受輸入5 10,但輸入5,10則失敗。

其次,scanf()自身實現的問題。scanf()不是以行單位對輸入內容進行解釋,而是對連續字元流進行解釋(換行字元也視為乙個字元)。scanf()連續地從流讀入字元,並且對和格式說明符(%d)相匹配的部分進行變換處理。例如,當格式說明符為%d 的時候,輸入

123(回車)
scanf()函式從流中取得 123 部分的內容,並對它進行處理。換行符依舊會殘留在流中。因此,在c**中需要使用乙個後續的 getchar()來吞食這個留下的換行符。

scanf()在讀入過程中有幾個物件被成功地變換,則 scanf()的返回值就為幾。如果做一下錯誤檢查,可能有人會寫出下面的**:

while (scanf("%d", &hoge) != 1)

替代scanf的方法

使用fgets()和 sscanf()組合方式來進行替代。如下:

int         hoge;

char        buf[256];

fgets(buf, sizeof(buf), stdin);

sscanf(buf, "%d", &hoge);

替代之後,在使用者輸入的一串字元中,匹配第乙個遇到的整數,賦值給hoge。

如何使用scanf函式?

問題二問題三 問題四補充 是通用終端格式化輸入函式,它從標準輸入裝置 鍵盤 讀取輸入的資訊。可以讀入任何固有型別的資料並自動把數值變換成適當的機內格式。其呼叫格式為 scanf 格式化字串 位址表 scanf 函式接收輸入資料時,遇以下情況結束乙個資料的輸入 不是結束該scanf函式,scanf函式...

關於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...