#include <stdio.h>
#include <math.h>
main() {
int a, b, c, d;
scanf("%d,%d,%d", a, b, c); // ❌ 缺少 & 取地址符
// ... 排序邏輯 ...
}
現象:程序無法正確讀取輸入,變量值為隨機垃圾值,排序結果錯誤。
scanf 需要變量地址以修改其值scanf 原型:int scanf(const char *format, ...);,可變參數**必須是指針**(地址)。a 是 int 值(垃圾值),傳值調用,**無法修改原變量**。&a 是 int*(地址),scanf 通過地址寫入內存,**正確修改變量**。
scanf("%d,%d,%d", &a, &b, &c); // ✅ 每個變量前加 &
, 也需注意scanf("%d,%d,%d", ...) 要求輸入**必須包含逗號分隔**(如 1,2,3)。1 2 3,**匹配失敗**,後續變量不被賦值。scanf("%d %d %d", &a, &b, &c); —— 空格匹配任意空白字符(空格、換行、Tab),更友好、魯棒。scanf 常見錯誤清單| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
scanf("%d", a); | 缺 & | scanf("%d", &a); |
scanf("%s", &str); (str為字符數組) | 數組名已是地址,加 & 類型錯誤 (char(*)[N] vs char*) | scanf("%s", str); 或 scanf("%s", &str[0]); |
scanf("%c", &ch); 連續調用 | 殘留換行符被讀取 | scanf(" %c", &ch); (格式串前加空格跳過空白) |
scanf("%f", &d); (d為 double) | 格式符不匹配 (%f 對應 float*) | scanf("%lf", &d); |
| 不檢查返回值 | 輸入失敗未處理 | if (scanf("%d", &a) != 1) { /* 錯誤處理 */ } |
printf("調試: &a=%p, a=%d\n", (void*)&a, a);
scanf("%d", &a);
printf("調試: 輸入後 a=%d\n", a);
scanf **必須傳遞變量地址**(&var),否則無法修改變量值。
字符數組/字符串輸入**不加 &**。
格式串**優先用空格分隔**,兼容性更好。
**養成檢查 scanf 返回值**習慣,健壯處理輸入錯誤。
這是 C 語言新手**最高頻、最隱蔽、後果最嚴重**的錯誤之一,務必刻意練習直到肌肉記憶。