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

C语言代码输入读取异常且输出全为NO,请求问题排查

代码问题分析及修复

首先看你的代码:

#include<stdio.h>

void main()
{

    int t,i=0;
    scanf("%d",&t);
    
    while(t--)
    {
        char c;
        scanf("%c",&c);
        char s[10]="codeforces";
        
        while(s[i]!='\0')
        {
            if(s[i]==c)
            printf("YES\n");
            
            else
            printf("NO\n");
            
            i++;
        }
    }

}

存在以下几个关键问题:

  • 输入残留换行符被读取:用scanf("%d", &t)输入测试用例数量后,按下的回车键会在输入缓冲区留下换行符。后续的scanf("%c", &c)会直接读取这个换行符,而非你输入的目标字符,导致第一次判断完全错误。

  • 变量i未在每次测试用例循环中重置:i定义在while(t--)循环外部,第一次循环后i会自增到10("codeforces"有10个有效字符),后续测试用例循环中,s[i]已是字符串结束符'\0',内层while循环直接跳过,无法正确执行判断逻辑。

  • 字符串数组长度不足:char s[10] = "codeforces";中,"codeforces"本身有10个字符,加上C语言字符串必需的结束符'\0',总共需要11字节空间。定义为s[10]会导致结束符无法被正确存储,内层while(s[i]!='\0')可能陷入死循环或错误判断。

  • 输出逻辑错误:当前代码会对"codeforces"的每个字符逐一判断并输出YES/NO,而非判断输入字符是否存在于字符串后输出一次结果。比如输入'c',会输出两次YES和八次NO,不符合常规需求。


修复后的代码示例

#include<stdio.h>

int main() // 标准C中main的返回类型应为int
{
    int t;
    scanf("%d", &t);
    getchar(); // 吃掉输入t后的换行符
    
    while(t--)
    {
        char c;
        scanf("%c", &c);
        getchar(); // 吃掉输入字符后的换行符
        char s[] = "codeforces"; // 自动计算长度,包含结束符
        int found = 0;
        int i = 0; // 每次循环重置i
        
        while(s[i] != '\0')
        {
            if(s[i] == c)
            {
                found = 1;
                break; // 找到匹配后直接跳出循环
            }
            i++;
        }
        
        printf(found ? "YES\n" : "NO\n"); // 统一输出一次结果
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Lakshmi Korti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:21:30