int num;
scanf("[%d]", &num); // 錯誤:嘗試匹配字面字元 '[' ']'
教材/文檔中常用**方括號 `[ ]` 表示參數可選**,例如:
scanf(format[, address]...); // 方括號內容可省略
**新手誤以為要輸入方括號**,實際格式字串應為 `"%d"`。
| 格式 | 含義 | 對應參數類型 |
|---|---|---|
| `%d` / `%i` | 有符號十進位整數 | `int *` |
| `%ld` | 長整數 | `long *` |
| `%f` / `%lf` | 浮點數 (float/double) | `float *` / `double *` |
| `%c` | 單一字元 (含空白) | `char *` |
| `%s` | 字串 (至空白) | `char *` (需預留空間) |
| `%[...]` | 掃描集合 (如 `%[^\n]` 讀整行) | `char *` |
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
| `scanf("%d", num);` | 缺 `&` 取址 | `scanf("%d", &num);` |
| `scanf("%s", str);` (str 未分配) | 野指針寫入 | `char str[100]; scanf("%99s", str);` |
| `scanf("%c", &ch);` 吃掉換行 | 上一殘留 `\n` | `scanf(" %c", &ch);` (前加空格跳過空白) |
| `scanf("%d\n", &n);` | 尾部 `\n` 導致需額外輸入 | `scanf("%d", &n);` |
// 1. 檢查返回值 (成功轉換個數)
if (scanf("%d", &num) != 1) {
// 處理輸入失敗:清空緩衝區
while (getchar() != '\n');
return ERROR;
}
// 2. 限制字串長度防溢出
char name[20];
scanf("%19s", name); // 最多讀 19 字元 + \0
// 3. 讀整行 (含空格)
char line[100];
scanf(" %99[^\n]", line); // 先跳過空白,再讀非換行字元
// 4. 完整輸入驗證循環
int getInt(const char* prompt) {
int val, rc;
while (1) {
printf("%s", prompt);
rc = scanf("%d", &val);
while (getchar() != '\n'); // 清空行尾
if (rc == 1) return val;
printf("輸入無效,請重新輸入整數。\n");
}
}