qimu9 2023-11-25 13:02 采纳率: 75%
浏览 8
已结题

c语言刷题,oj不通过,求解

求解,为什么oj显示运行错误

img

#include<stdio.h>
int main()
{
    int n,b=0,d=0, a = 0;
    scanf("%d", &n);
    char c;
    while (a < n)
    {
        if(d==0)
        getchar();
        d = 0;
        c = getchar();
        if (c=='_' || (c > 64 && c < 91) || (c > 96 && c < 123))
            ;
        else
        {
            while ((getchar()) != '\n')
                ;
            d = 1;
            printf("no\n");
            continue;
        }
        while ((c = getchar()) != '\n')
        {
            if (c == '_' || (c < 58 && c>47) || (c > 64 && c < 91) || (c > 96 && c < 123))
                ;
            else
            {
                b = 1;
                printf("no\n");
                break;
            }
        }
        if (b == 1)
            continue;
        if (c == '\n')
            printf("yes\n");
        a++;
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • XL11 2023-11-25 13:18
    关注

    代码存在一些逻辑上的问题和潜在的bug,这些可能是导致在线判题系统(OJ)显示运行错误的原因。让我们逐一解决这些问题。

    你使用 getchar() 来读取字符,这个函数会从标准输入中读取下一个可用的字符。如果输入流中没有可用字符,它会一直等待。这可能会导致你的程序挂起,尤其是当不按预期输入时。

    你在读取字符时没有考虑到可能的EOF(文件结束符)。当输入结束时,getchar() 会返回 EOF,但是你的代码没有检查这种情况。

    你在程序中使用了多次 getchar() 来读取直到行尾,这在循环中可能会导致一些字符被错误地读取或者忽略。

    变量 b 在每次循环开始前应该重置。否则,如果一次迭代中 b 被设置为1,即使后续的字符串是有效的,它也会继续输出 "no"。

    下面是修改后的代码,包括注释和修复:

    #include<stdio.h>
    
    int main()
    {
        int n; // 要检查的字符串数量
        scanf("%d", &n);
        getchar(); // 读取换行符
        for(int i = 0; i < n; i++)
        {
            int valid = 1; // 假设字符串是有效的
            char c = getchar(); // 读取第一个字符
            // 检查第一个字符是否是字母或下划线
            if (!(c=='_' || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')))
            {
                valid = 0; // 不符合条件,设置为无效
            }
            
            // 读取剩余的字符
            while (valid && (c = getchar()) != '\n' && c != EOF)
            {
                // 检查字符是否符合标识符规则(字母、数字、下划线)
                if (!(c == '_' || (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')))
                {
                    valid = 0; // 发现无效字符
                }
            }
    
            if (c == EOF) {
                break; // 如果输入结束,跳出循环
            }
    
            // 根据字符串是否有效输出结果
            if (valid)
                printf("yes\n");
            else
                printf("no\n");
            
            // 如果字符串无效,读取直到行尾的所有字符
            if (!valid)
            {
                while ((c = getchar()) != '\n' && c != EOF)
                    ;
            }
        }
        return 0;
    }
    
    
    

    注意:

    现在,在每次读取新字符串之前将 valid 设置为1。
    添加了对EOF的检查,以防输入流在读取n个字符串之前结束。
    只在发现无效字符串时读取到行尾的所有字符。
    在循环中使用了 for 循环,它使代码更清晰易懂。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月4日
  • 已采纳回答 11月26日
  • 创建了问题 11月25日