易错库
对照错误/正确写法,理解 why 后在自己代码里搜一遍。
1. if (x = 1)
| 错误 | 正确 |
|---|---|
if (x = 1) | if (x == 1) |
为什么:左边是赋值,永远把 1 写入 x 且条件为真。要比较用 ==。
2. 忘写 & 读入
| 错误 | 正确 |
|---|---|
scanf("%d", n); | scanf("%d", &n); |
为什么:scanf 需要地址。漏 & 往往直接段错误或未定义行为。
3. 数组下标写到 n
| 错误 | 正确 |
|---|---|
for (i = 0; i <= n; i++) a[i] = 0; | for (i = 0; i < n; i++) a[i] = 0; |
为什么:长度 n 的合法下标是 0..n-1。用 < n 而不是 <= n。
4. 字符串数组太短
| 错误 | 正确 |
|---|---|
char s[3] = "abc"; | char s[4] = "abc"; |
为什么:"abc" 还要放 \0,共 4 字节。太短会越界。
5. 整数除丢掉小数
| 错误 | 正确 |
|---|---|
float avg = sum / n; | float avg = (float)sum / n; |
为什么:sum/n 若都是 int,结果是整数。先转 float 再除。
6. 函数改不了外面变量
| 错误 | 正确 |
|---|---|
void f(int x){ x=1; } f(n); | void f(int *x){ *x=1; } f(&n); |
为什么:传值是副本。要改实参就传指针,或 return 新值。
7. 循环变量不更新
| 错误 | 正确 |
|---|---|
while (i < 10) { printf("%d", i); } | while (i < 10) { printf("%d", i); i++; } |
为什么:条件永真且 i 不变 → 死循环。体里要有 i++。
8. 宏缺括号
| 错误 | 正确 |
|---|---|
#define SQ(x) x*x | #define SQ(x) ((x)*(x)) |
为什么:SQ(1+2) 会变成 1+2*1+2=5 而不是 9。多加括号。
9. fopen 不判空
| 错误 | 正确 |
|---|---|
FILE *fp = fopen("a.txt","r"); fgets(...); | FILE *fp = fopen("a.txt","r"); if(!fp) return 1; |
为什么:文件不存在或无权限时 fp 为 NULL,直接用会崩溃。
10. strcmp 直接当布尔
| 错误 | 正确 |
|---|---|
if (strcmp(a,b)) 相同; | if (strcmp(a,b) == 0) 相同; |
为什么:strcmp 相等时返回 0(C 里 0 为假)。要写 == 0 才是「相同」。