为何我的C语言代码总是进入if条件分支导致score为-1?
问题原因及解决方案
核心问题分析
你遇到的score被设为-1的情况,本质是代码读取到了check_letter_validity判定为非法的字符,常见原因有以下几种:
输入了未被允许的空白字符
你的check_letter_validity函数只允许空格(' ')作为空白输入,但如果输入时不小心用了**制表符(Tab)**或换行符(当scanf格式符错误时),这些字符会被判定为非法,直接触发score=-1的分支。scanf格式符或输入结束方式错误- 如果你实际运行的代码中,
scanf("%c", &x)没有写前面的空格(即格式符为"%c"而非" %c"),那么输入文本后的换行符会被读取,而换行符不在合法字符范围内,导致判定非法。 - 在Windows系统下,如果在行中间按下
Ctrl+Z结束输入,可能会读取到ASCII码为26的EOF字符,该字符不在合法范围内,触发非法判定。
- 如果你实际运行的代码中,
printf语句的语法错误
你代码中的printf字符串直接跨行(未用\n转义换行),这在C语言中属于语法错误,编译时会报错。如果强行修改运行,可能导致输入提示乱码,误输入非法字符。
修复方案
针对上述问题,逐一修正:
1. 修正printf语句的换行
将直接跨行的字符串改为用\n转义换行,避免语法错误:
printf("Please Enter Cool Letter : \n"); printf("Please Enter Text : \n");
2. 优化合法字符判定(可选)
如果需要允许所有空白字符(如制表符、换行),可以借助<ctype.h>中的isspace函数,简化判定逻辑:
#include <ctype.h> // 需要添加这个头文件 bool check_letter_validity(char x){ if (isspace(x)) // 允许所有标准空白字符 return true; if (islower(x) || isupper(x)) // 直接判定大小写字母 return true; return false; }
如果只允许空格,保留原判定逻辑即可,但要确保输入时只使用空格分隔。
3. 规范输入结束方式
- Unix/Linux/macOS:输入完文本后,按
Ctrl+D触发EOF,终止输入。 - Windows:在新的一行开头按
Ctrl+Z,再按回车,避免在行中间输入EOF字符。
4. 确认scanf格式符
确保读取文本的scanf格式符为" %c",前面的空格会自动跳过所有空白字符(包括空格、换行、制表符),避免读取到非法空白:
while (scanf(" %c", &x) == 1 )
关于预期得分的说明
以你举例的输入"bhkb kBfj"和酷字母b为例,修正后的代码会统计到3次合法匹配(b、b、B),由于没有连续出现的情况,最终得分为3。如果你的预期得分是2,可能是输入文本或计分逻辑需要调整,可以进一步核对输入内容或计分规则。
内容的提问来源于stack exchange,提问作者Razi Al Ashhab
相关产品推荐
相关产品推荐

