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

为何我的C语言代码总是进入if条件分支导致score为-1?

问题原因及解决方案

核心问题分析

你遇到的score被设为-1的情况,本质是代码读取到了check_letter_validity判定为非法的字符,常见原因有以下几种:

  1. 输入了未被允许的空白字符
    你的check_letter_validity函数只允许空格(' ')作为空白输入,但如果输入时不小心用了**制表符(Tab)**或换行符(当scanf格式符错误时),这些字符会被判定为非法,直接触发score=-1的分支。

  2. scanf格式符或输入结束方式错误

    • 如果你实际运行的代码中,scanf("%c", &x)没有写前面的空格(即格式符为"%c"而非" %c"),那么输入文本后的换行符会被读取,而换行符不在合法字符范围内,导致判定非法。
    • 在Windows系统下,如果在行中间按下Ctrl+Z结束输入,可能会读取到ASCII码为26的EOF字符,该字符不在合法范围内,触发非法判定。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:17:13