坑 1:%c 吃掉残留换行
scanf("%d", &n) 只读走数字,行尾的 \n 留在缓冲区;而 %c 是唯一不跳过空白的常用格式符,游标对着什么就收什么,于是紧接的 scanf("%c", &c) 收下的是换行符。修法:写成 scanf(" %c", &c)——格式串里的前置空格表示「先跳过任意多个空白再读」,等价写法是中间先调一次 getchar() 把换行吃掉。
坑 2:%s 遇空格就停
想读整行 hello world,用 scanf("%s", s) 只能拿到前半截 hello——%s 遇空白就认为一个词读完了。整行带空格的输入,一律用 fgets(s, sizeof s, stdin):它只认换行,空格照单全收,第二个参数还限定容量防越界。注意 fgets 会把行尾 \n 一起存进数组,惯用法 s[strcspn(s, "\n")] = '\0' 去掉它(要引 string.h),否则 strcmp 永远不相等、输出还多空行。
坑 3:读到文件尾的循环条件
每行两个数、读到 EOF 为止的题,写 while (scanf("%d %d", &a, &b) == 2):读满 2 项返回 2 继续,撞 EOF 或坏输入返回值都不是 2,循环自然停。别写 != EOF——遇到非法字符 scanf 返回 0 或 1,不等于 EOF,会死循环。课件里三组 (1,2)(3,4)(5,6) 用这个写法累加,稳稳输出 21。