精通 C 語言的 scanf 函式:格式說明子、輸入驗證與常見陷阱

1. scanf 函式概觀

在學習 C 程式語言時,最常使用的資料輸入方法之一就是 scanf 函式。它就像程式的「聆聽者」,將使用者輸入的資料存入指定的變數中。

scanf 的基本語法

scanf("formatSpecifier", &variable);

此處的關鍵要素是「formatSpecifier」以及變數前的位元組運算子 (&)。格式指定子指明要輸入的資料類型,& 表示該變數的位址。遵循此規則,scanf 就能正確處理使用者的輸入。

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

如此一來,scanf 為程式提供輸入,並使資料可供使用。

2. 常用的格式指定子

  • %d : 整數
  • %f : float 類型的浮點數
  • %lf : double 類型的雙精度浮點數
  • %s : 字串(以空白字元結束)
  • %c : 單一字元
double val;
scanf("%lf", &val);

3. 同時處理多筆輸入

int age;
float height;
scanf("%d %f", &age, &height);
printf("Age: %d, Height: %.2fn", age, height);

4. 輸入驗證與錯誤處理

int age;
printf("Please enter your age (0–120): ");
if (scanf("%d", &age) == 1 && age >= 0 && age <= 120) {
    printf("The entered age is %d years.n", age);
} else {
    printf("Invalid age.n");
}

5. 清除輸入串流

使用 scanf 時,可能會感覺「先前的輸入仍然存在」。這是因為換行字元(\n)等仍留在輸入串流中所致。

scanf("%*[^n]");
scanf("%*c");

這樣可以跳過輸入緩衝區中遺留的換行或其他字元。然而,在迴圈處理時應避免使用非標準的 fflush(stdin),而應採用上述方法以確保安全。

6. 常見陷阱與最佳實踐

  • 格式指定子相符: 確保資料類型與指定子一致
  • 字串長度注意: 使用 %s 輸入時,需考慮緩衝區大小
  • 清除串流: 避免留下換行字元

7. 進階用法 | 精緻的 scanf 技巧

char name[20];
printf("Please enter your name: ");
scanf("%19s", name);  // buffer-safe measure
printf("Hello, %s!n", name);

總結

scanf 函式是 C 語言中基本的輸入方式。只要了解格式指定子、錯誤檢查與輸入串流的處理,就能安全地使用它。特別要留意遺留的輸入緩衝區以及緩衝區溢位問題。