C語言 scanf 函式完全攻略|用法、錯誤處理、進階技巧

1. scanf函式是什麼?

在學習 C 語言的過程中,scanf 函式是常用來從使用者那裡取得輸入資料的方法。它的角色就像是程式的「傾聽者」,可以把使用者輸入的資料儲存到指定的變數中。

scanf 的基本語法

scanf("格式指定子", &變數);

這裡的重點是「格式指定子」和變數前面的 &。格式指定子用來指定輸入資料的型別,而 & 則是指定變數的記憶體位址。只要遵守這個簡單的規則,scanf 就能在程式中正確處理使用者的輸入。

例如,要讀取一個整數,可以這樣寫:

int num;
scanf("%d", &num);

透過這種方式,程式能夠取得輸入並加以使用。scanf 就是 C 語言中處理資料輸入的可靠幫手。

2. 基本用法

scanf 函式的基本用法是「依照格式指定子,將輸入值存入對應變數」。這個格式可以用來指定輸入值的型別,例如整數、浮點數或字元。

整數的輸入

int num;
scanf("%d", &num);

%d 是用來輸入整數的格式指定子。使用者輸入 10,變數 num 就會被設為 10。

浮點數的輸入

float pi;
scanf("%f", &pi);

%f 是用來輸入浮點數的格式指定子。輸入 3.14,就能將其儲存在 pi 這個變數中。

字元的輸入

char ch;
scanf(" %c", &ch);

輸入單一字元時要注意:格式指定子 " %c" 前面加了一個空白。這是為了跳過前面的換行符號(例如按下 Enter 時產生的 \n),避免讀到錯誤的資料。

3. 同時輸入多個值

scanf 函式可以一次讀取多個值,只要在格式指定子中依序寫上對應的格式,並提供相對應的變數即可。

範例:兩個整數的輸入

int a, b;
scanf("%d %d", &a, &b);

這段程式碼會等待使用者依序輸入兩個整數(以空格或 Enter 分隔)。例如,輸入「10 20」時,a 就會是 10,b 就會是 20。

不同型別的同時輸入

int id;
float score;
scanf("%d %f", &id, &score);

這段程式碼會依序讀取一個整數與一個浮點數。例如輸入「101 98.5」,id 為 101,score 為 98.5。透過這種方式,可以更有效率地從使用者那裡取得多筆資料。

4. 格式指定子一覽與說明

scanf 使用格式指定子來判斷輸入值的型別。以下是常用的格式指定子與對應的變數型別:

格式指定子說明對應的變數型別
%d輸入十進位整數int
%f輸入浮點數float
%lf輸入雙精度浮點數double
%c輸入單一字元char
%s輸入字串(不含空格)char[]

根據輸入的資料型別,請務必使用正確的格式指定子。否則可能導致未定義的行為或程式錯誤。

5. scanf 的錯誤處理

scanf 雖然使用方便,但如果輸入資料不正確,可能會導致錯誤或程式無法如預期執行。因此,進行輸入時的錯誤處理是很重要的。

回傳值的活用

scanf 的回傳值是「成功讀取的項目數」。如果期望讀取兩個整數,但使用者只輸入了一個,那麼回傳值會是 1。

int a, b;
int result = scanf("%d %d", &a, &b);
if (result != 2) {
    printf("輸入格式錯誤,請重新輸入。\n");
}

透過檢查回傳值,可以有效避免錯誤資料造成的問題,提升程式的穩定性。

清除輸入緩衝區

若輸入錯誤或需要重新輸入時,建議清除輸入緩衝區(也就是還沒被讀取的輸入資料),否則可能會殘留錯誤資料影響下一次輸入。常見的清除方法之一是使用下列程式碼:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

這段程式碼會讀取並丟棄直到換行為止的所有字元,有助於確保輸入乾淨。

6. 應用技巧與注意事項

掌握 scanf 的基本用法後,也可以進一步學習一些實用的應用技巧和常見的陷阱,讓程式變得更穩定、更安全。

讀取多字元字串

scanf("%s", str); 雖然可以讀取字串,但遇到空白(如空格或換行)就會結束輸入。如果要讀取包含空格的字串,建議使用 fgets 函式。

char str[100];
fgets(str, sizeof(str), stdin);

限制輸入長度

使用 %Ns 的方式可以限制字串的輸入長度,避免發生緩衝區溢位(Buffer Overflow)問題。

char name[10];
scanf("%9s", name);

這樣可以限制最多讀取 9 個字元(加上結尾的 \0),提高安全性。

避免緩衝區殘留

輸入字元時,如果沒有加上空格(如 " %c"),可能會讀到殘留的換行符號。這是初學者常犯的錯誤之一,請特別注意。

7. 總結

scanf 是 C 語言中處理使用者輸入的重要工具。只要掌握基本語法、格式指定子的使用方法,以及常見錯誤的處理技巧,就能靈活且安全地讀取輸入資料。

本篇文章介紹了 scanf 的基本用法、多重輸入、錯誤處理、緩衝區清除、以及進階技巧等,對於初學者建立穩固的輸入基礎相當有幫助。今後在寫程式時,請善用這些知識,讓你的 C 語言更上層樓!

侍エンジニア塾