m0_63105697 2022-01-15 13:55 采纳率: 40%
浏览 72
已结题

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字,有错误,不明白。

问题遇到的现象和发生背景

在pat上刷题遇到的一个问题,不清楚哪里格式错误
题目是:

img

问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<string.h>
void panduan(char c)
{
    switch(c)
    {   case'0':printf("ling");break;
        case'1':printf("yi");break;
        case'2':printf("er");break;
            case'3':printf("san");break;
                case'4':printf("si");break;
                    case'5':printf("wu");break;
                        case'6':printf("liu");break;
                            case'7':printf("qi");break;
                                case'8':printf("ba");break;
                                    case'9':printf("jiu");break;
                                    default:break;
    }
}
int main()
{
    char x[101],y[101];int l,i,sum=0,sum1,n=0;int a[101];
    gets(x);
    l=strlen(x);
    for(i=0;i<l;i++)
    {
        a[i]=x[i]-'0';
        sum=sum+a[i];
    }sum1=sum;
    while(sum1>0)
    {
        sum1/=10;
        n++;
    }
    for(i=0;i<n;i++)
    {
        y[n-i-1]=sum%10+'0';
        sum/=10;
    }l=strlen(y);
    for(i=0;i<l;i++)
    {
        panduan(y[i]);
        if(i<l-1)
        printf(" ");
        else;
    }
    return 0;
}

###### 运行结果及报错内容 

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/912988522246123.PNG "#left")

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/76774952224610.PNG "#left")


  • 写回答

3条回答 默认 最新

  • 关注

    因为strlen计算字符串长度的时候,需要找到\0才会结束,而你的代码中 没有给y初始化,也没有在y[n]='\0',所以用l=strlen(y)计算长度的时候出现错误。修改方法有三种:
    一是:把y[101]初始化一下就可以了
    char x[101],y[101]={0}; //这里把y的所有元素都赋值为0
    第二种修改方法:
    在l=strlen(y);这一句前面加一句
    y[n] = 0;
    第三种方法:
    把 第38行的 l=strlen(y);这一句,改成

    l=n;  //l=strlen(y);
    
    

    因为n本身就是计算结果的实际长度,不需要再去计算了。


    修改后的代码:

    #include<stdio.h>
    #include<string.h>
    void panduan(char c)
    {
        switch(c)
        {   
        case'0':printf("ling");break;
        case'1':printf("yi");break;
        case'2':printf("er");break;
        case'3':printf("san");break;
        case'4':printf("si");break;
        case'5':printf("wu");break;
        case'6':printf("liu");break;
        case'7':printf("qi");break;
        case'8':printf("ba");break;
        case'9':printf("jiu");break;
        default:break;
        }
    }
    int main()
    {
        char x[101],y[101]={0}; //这里给y初始化一下,所有值赋值为0
        int l,i,sum=0,sum1,n=0;
        int a[101];
        gets(x);
        l=strlen(x);
        for(i=0;i<l;i++)
        {
            a[i]=x[i]-'0';
            sum=sum+a[i];
        }sum1=sum;
        while(sum1>0)
        {
            sum1/=10;
            n++;
        }
        for(i=0;i<n;i++)
        {
            y[n-i-1]=sum%10+'0';
            sum/=10;
        }
        //y[n]=0; //如果前面没有给y初始化,在这里加上这一句也是可以的,这样用strlen(y)也能得到实际长度
        l=n;//l=strlen(y); //n已经是计算结果的长度了,没必要再去计算一次了,直接让l=n就可以了
        for(i=0;i<l;i++)
        {
            panduan(y[i]);
            if(i<l-1)
                printf(" ");
            //else; //这一句不要也行
        }
        return 0;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月23日
  • 已采纳回答 1月15日
  • 创建了问题 1月15日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)