scanf 需要變數的位址才能寫入資料,因此必須配合 & 運算子:
int i;
scanf("%d", &i); // 正確:傳遞 i 的位址
| 錯誤寫法 | 問題 | 修正 |
|---|---|---|
scanf("%d", i); | 傳值而非傳址,導致隨機記憶體寫入 | 加上 & |
scanf("%d\n", &i); | 格式字串中的 \n 會吞噬後續輸入 | 移除 \n,改用 scanf("%d", &i); |
char c; scanf("%c", &c); | 殘留換行符被讀取 | 使用 scanf(" %c", &c);(前置空白跳過空白字元) |
scanf 回傳成功匹配的項目數,建議永遠檢查:
if (scanf("%d", &i) != 1) {
// 處理輸入錯誤:清空緩衝區或提示重輸
while (getchar() != '\n'); // 簡易清空
}
// 讀取整數並回傳是否成功
bool read_int(int *out) {
return scanf("%d", out) == 1;
}
// 使用
int val;
if (read_int(&val)) {
printf("讀到:%d\n", val);
}
scanf 必須搭配變數位址使用,格式字串勿加多餘空白字元,並務必檢查回傳值以確保輸入有效。掌握這三點即可避開 90% 的輸入相關 Bug。