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

C语言答题程序if条件判断异常及字符串匹配问题求解

第一个版本代码错误原因

  1. scanf格式串使用错误
    你写的scanf("%[a-z]s",f)存在两个问题:
  • %[a-z]是扫描集格式说明符,本身不需要后面加s,多余的s会导致scanf额外尝试匹配输入中的s字符,属于完全多余的写法
  • %[a-z]仅匹配小写字母,碰到输入中的空格就会停止读取,你输入的mount everest中间有空格,所以最终f里只存储了mount,和正确答案mount everest不一致,strcmp返回非0值,自然进入else分支
  1. !s == 0的逻辑是歪打正着的错误
    C语言中逻辑非!的优先级高于相等运算符==,所以!s == 0等价于(!s) == 0:
  • 当两个字符串不等时,strcmp返回非0值,!非0值的结果是0,0 == 0条件成立,所以才进入if分支输出正确提示
  • 这个写法完全是逻辑颠倒的巧合,哪怕你输入错的答案,只要strcmp返回非0,这个条件都会成立,是严重的逻辑错误

第二个版本fgets代码错误原因

你改用fgets的思路是对的,但忽略了fgets的特性:fgets会将输入末尾的换行符\n一起存入目标数组。你输入mount everest后按回车,f中存储的实际是mount everest\n,比正确答案多了一个换行符,strcmp自然会判定两个字符串不等。
另外你写的fgets(f,15,stdin)参数也有问题,mount everest本身长度是13,加上换行符是14,刚好占满15字节的限额,但如果后续题目答案更长,会出现截断问题,直接填数组大小30更稳妥。

修复方案

方案1:修改scanf版本

把scanf行改为:

scanf("%29[a-z ]", f);
  • 29是为了避免输入溢出,留1字节存字符串结束符\0
  • 扫描集里加了空格,就能正常读取带空格的小写字母答案
  • 去掉了多余的s

方案2:修改fgets版本

在fgets后面加一行移除换行符的代码:

fgets(f, 30, stdin);
f[strcspn(f, "\n")] = '\0'; // 移除末尾的换行符

这样处理后再用strcmp比较就正常了。

内容的提问来源于stack exchange,提问作者Black Apathy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:48:01