You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:39:03