C语言答题程序if条件判断异常及字符串匹配问题求解
第一个版本代码错误原因
- scanf格式串使用错误
你写的scanf("%[a-z]s",f)存在两个问题:
%[a-z]是扫描集格式说明符,本身不需要后面加s,多余的s会导致scanf额外尝试匹配输入中的s字符,属于完全多余的写法%[a-z]仅匹配小写字母,碰到输入中的空格就会停止读取,你输入的mount everest中间有空格,所以最终f里只存储了mount,和正确答案mount everest不一致,strcmp返回非0值,自然进入else分支
!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
相关产品推荐
相关产品推荐

