在pat上刷题遇到的一个问题,不清楚哪里格式错误
题目是:
#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;
}
###### 运行结果及报错内容


因为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;
}