CLion中scanf读取输入异常问题求助及原因排查
scanf输入异常问题解析与CLion使用建议
环境信息
- 设备:搭载M2芯片的MacBook Pro
- CLion版本:2023.1.5
- 构建工具链:ninja,C编译器为cc(实际是Apple clang 14.0.3)
测试过程与现象
1. 初始代码与异常输出
#include <stdio.h> int a[100]; int main(void) { for (int i = 0; i < 12; i++) { scanf("%d", &a[i]); printf("%d", a[i]); } }
输入(包含UTF-8非断空格\xc2\xa0):
0 1 0 2 1 0 1 3 2 1 2 1
输出:
000000000000
2. 添加getchar()后的部分正确输出
#include <stdio.h> int a[100]; int main(void) { for (int i = 0; i < 12; i++) { scanf("%d", &a[i]); getchar(); printf("%d", a[i]); } }
相同输入下输出:
001000201000
3. 修改scanf格式并添加两次getchar()后的正常输出
#include <stdio.h> int a[100]; int main(void) { for (int i = 0; i < 12; i++) { scanf("%d ", &a[i]); getchar(); getchar(); printf("%d", a[i]); } }
相同输入下输出(符合预期):
01021013212
问题原因
输入中混入了UTF-8编码的非断空格(\xc2\xa0),这是导致异常的核心:
- 标准C的
scanf("%d")仅将普通空格(\x20)、换行、制表符视为数值输入的分隔符,非断空格不属于这类空白字符,会被识别为非数值的无效字符。 - 第一次测试中,
scanf读取第一个0后,遇到非断空格,后续scanf尝试读取数值时持续被该无效字符阻塞,数组a的后续元素始终为初始值0,因此输出全0。 - 添加
getchar()后,每次只能读取一个字节,但非断空格是双字节UTF-8字符,getchar()仅能吃掉其中一个字节(\xc2),剩余的\xa0仍会干扰后续输入,所以输出仅部分正确。 - 修改为
scanf("%d ")后,格式串末尾的空格会匹配任意数量的普通空白字符,但非断空格仍不被匹配,两次getchar()刚好吃掉非断空格的两个字节,因此能正确读取所有数字。 - 该异常由剪贴板工具upaster偶发引入非断空格导致,复制正常文本后即可恢复,与CLion本身无关。
是否适合继续使用CLion
完全可以继续使用CLion。此问题根源是第三方剪贴板工具引入的特殊字符,并非CLion的功能缺陷。CLion作为专业的C/C++ IDE,在代码编辑、编译调试等方面功能完善,非常适合编程新手学习和开发。
内容的提问来源于stack exchange,提问作者adam sir
相关产品推荐
相关产品推荐

