为什么C语言中使用%[^ ]扫描集读取带空格字符串时失效
问题原因及修复方案
核心问题点
- 前序
scanf("%d", &studentId)执行完成后,输入缓冲区残留了用户按下回车产生的\n字符,后续%[^\n]规则是读取到换行符就停止,匹配到第一个字符就是换行直接返回,所以不会等待用户输入。 - 格式符写法错误:
%[^\n]本身就是完整的扫描集格式说明符,不需要在后面额外加s,多余的s会导致scanf尝试匹配输入流中的字面量s,既会触发编辑器语法校验标红,也会导致匹配逻辑异常。 - 传参错误:数组名本身就是指向数组首地址的指针,
scanf("%[^\n]", &name)中的&是多余的,直接传name即可。
修复方案
修复后的参考代码
int prelim, midterm, semiFinal, final, totalScore, yearLevel, studentId; float averageScore = 0; char name[25], degree[25]; printf("Enter your student id: "); scanf("%d", &studentId); // 吃掉学号输入后残留的换行符 getchar(); printf("Name: "); // 加长度限制避免缓冲区溢出,去掉多余的s和& scanf("%24[^\n]", name); getchar(); printf("Degree: "); scanf("%24[^\n]", degree); getchar(); printf("Year: "); scanf("%d", &yearLevel);
你也可以选择在格式符前加空格,自动忽略所有前置空白字符(换行、空格、制表符等),不需要额外加getchar():
scanf(" %24[^\n]", name);
内容的提问来源于stack exchange,提问作者NemuriNemuri
相关产品推荐
相关产品推荐

