亦行之 2024-03-05 10:59 采纳率: 34.5%
浏览 366

c语言在pta上提示运行时错误

求!!请问为什么提交到pta后有运行时错误的提示?在devc++软件上可以成功得到输出样例,有人能帮我解答一下吗

img


#include<stdio.h>
#include<string.h>
//运行时错误 ??
int main()
{
    char s[10001];
//    scanf("%s",s);
    gets(s);
    int sum=0;
    char str[30]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    //存储字母
    
    int len=strlen(s); 
//    printf("%d",len);
    for(int i=0;i<len;i++){
        if((s[i]>='A'&&s[i]<='Z')||(s[i]-32>='A'&&s[i]-32<='Z'));//大写或小写是字母的情况
        {
            for(int j=0;j<26;j++){
                if(s[i]==str[j]||s[i]-32==str[j]){
                    sum+=j+1;//序号加起来 
                    break;
                }
            }
         } 
    }//开始就错在应该大小写分开判断因为str里只存储了大写的
//    printf("%d",sum); 
    int num1=0,num0=0;
    //化为二进制如何化? 
     while(sum!=1){
         if(sum%2==1)//奇数
         {
             num1++;
             sum=(sum-1)/2; 
          } 
          else{
              num0++;
              sum=sum/2;
          }
     } 
     num1++;//sum最后==1 
     printf("%d %d",num0,num1);
    return 0;
}

img

  • 写回答

7条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-03-05 11:00
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的C语言代码中,程序的主要功能是对输入的字符串中的字母按照字母表顺序计算序号之和,并将该和转换为二进制表示,输出0和1的数量。您提到在DevC++上运行正常但在PTA平台上出现运行时错误。

    针对您的问题,可能存在以下几种情况导致PTA平台运行出错:

    1. gets(s)函数的问题:在标准C库中,gets函数已被废弃,因为它存在安全风险(无法限制读取的字符数),可能导致缓冲区溢出。建议替换为更安全的fgets函数,如下所示:
    fgets(s, sizeof(s), stdin);
    s[strcspn(s, "\n")] = '\0'; // 去掉末尾换行符
    
    1. 输入格式的差异:PTA平台可能对输入有特定要求,比如必须严格遵循题目规定的输入格式。确保你的代码能够处理任何合法且非法的输入情况。

    2. 超时问题:虽然这段代码在较小规模的数据上可能不会出现问题,但如果数据范围较大,循环结构可能会导致程序执行时间过长,在某些在线评测系统中可能因此被判为运行时错误。请检查是否有可能造成算法效率低下的地方。

    3. 编译选项不同:PTA平台使用的编译器或编译选项与DevC++可能存在差异,一些行为在不同的编译环境中可能表现不同。

    修改后的完整代码如下:

    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
        char s[10001];
        fgets(s, sizeof(s), stdin);
        s[strcspn(s, "\n")] = '\0'; // 去除末尾换行符
    
        int sum=0;
        char str[26] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
        
        int len=strlen(s); 
        for(int i=0; i<len; i++){
            char c = s[i];
            if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){ // 大小写统一判断
                for(int j=0; j<26; j++){
                    if(c == str[j] || (c >= 'a' && c - 'a' == j)){ // 考虑大小写字母
                        sum += j + 1;
                        break;
                    }
                }
            } 
        }
    
        int num1=0, num0=0;
        while(sum != 1){
            if(sum % 2 == 1){
                num1++;
                sum = (sum - 1) / 2; 
            } else {
                num0++;
                sum /= 2;
            }
        } 
        num1++; // 对应sum最后等于1的情况
        
        printf("%d %d", num0, num1);
    
        return 0;
    }
    

    综上,请您首先尝试替换getsfgets,并根据PTA平台的具体题目要求调整输入处理逻辑。如果问题仍然存在,请提供更多关于PTA平台上的错误信息以便进一步分析。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月5日