原始錯誤代碼
#include <stdio.h>
#include <stdlib.h>
void main() {
scanf("%d,%d", &a, &a, &b); // 錯誤 1、2、3
c = max(a, b); // 錯誤 4
print("max=%d", c); // 錯誤 5
return 0;
}
五大錯誤逐一拆解
| 行號 | 錯誤代碼 | 問題分析 | 正確寫法 |
| 1 | void main() | C 標準要求 int main() 或 int main(void) | int main(void) |
| 2 | scanf("%d,%d", &a, &a, &b) | 格式字串 2 個 %d 對應 3 個參數;重複 &a;變數未宣告 | int a, b; scanf("%d %d", &a, &b); |
| 3 | c = max(a, b) | C 標準庫無 max 函數(C++ 有 std::max) | 自寫巨集/函數或三元運算子 |
| 4 | print(...) | C 語言輸出函數是 printf,非 print | printf("max=%d\n", c); |
| 5 | 變數 a,b,c 未宣告類型 | C 需顯式宣告,且需在區塊開頭(C89)或使用前(C99) | int a, b, c; |
標準修正版
#include <stdio.h>
#include <stdlib.h>
// 方案 1:巨集(編譯期展開,零開銷)
#define MAX(x, y) ((x) > (y) ? (x) : (y))
// 方案 2:內聯函數(類型安全,現代 C 推薦)
static inline int max_int(int x, int y) {
return x > y ? x : y;
}
int main(void) {
int a, b, c;
printf("請輸入兩個整數(空格分隔):");
if (scanf("%d %d", &a, &b) != 2) {
fprintf(stderr, "輸入格式錯誤\n");
return EXIT_FAILURE;
}
c = MAX(a, b); // 或 max_int(a, b)
printf("max=%d\n", c);
return EXIT_SUCCESS;
}
進階延伸:泛型最大值(C11 _Generic)
#define MAX_GENERIC(x, y) _Generic((x), \
int: max_int, \
double: max_double, \
float: max_float \
)(x, y)
static inline double max_double(double x, double y) { return x > y ? x : y; }
static inline float max_float(float x, float y) { return x > y ? x : y; }
// 使用
int imax = MAX_GENERIC(3, 5);
double dmax = MAX_GENERIC(3.14, 2.71);
避坑指南
- scanf 格式字串:
%d,%d 要求輸入 "3,5";%d %d 允許 "3 5"、"3\n5",後者更友善
- 返回值檢查:
scanf 返回成功匹配項數,必須檢查防止垃圾值
- 巨集副作用:
MAX(a++, b) 會導致 a 增加兩次,內聯函數無此問題
- 標準合規:嚴格模式編譯
gcc -std=c11 -pedantic -Wall -Wextra