一、概述
做advanced的题做的快自闭,A1004的题目应该和层次遍历有关系,不想写,做点basic的歇歇。但这个1002可日了狗了。
1002很简单的思路,给一个特别大的数,求它的各位和,数太大用double都不行,那就用char。我的思路特别弱智,char存数组,sum存各位和,sum转char,输出各位。因此需要两个char。这就出现了特别奇怪的bug。
二、代码及分析
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[200],b[5];
scanf("%s", a);
int i = 0;
int sum = 0;
while (a[i] != '\0')
{
sum = sum + a[i]-48;
i++;
}
sprintf(b,"%d", sum);
i = 0;
while (b[i+1] != '\0')
{
switch (b[i])
{
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;
}
i++;
}
switch (b[i])
{
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;
}
}
一个问题是如何将int转换为char,使用itoa函数在vs里跑的是很舒服,但是pat这个oj不认,会报错,于是使用sprintf,这个是标准库函数,可以用。我在声明两个数组的时候使用的是char a[200], b[5],于是奇怪的bug出现了。我的sprintf函数的参数是用错了。应该是
sprintf(b,"%d", sum);
但我写成了
sprintf(a,"%d", sum);
即sum中的值写入了a而不是b,这样一来b中的值全是未定义,无法输出是对的,而a中从a[0]开始则是sum各位的值。然后呢,由于我使用的是while,找不到\0他就会一直往下找,找完b之后,它去找a了,这说明a的地址是在b之后,而它们是紧紧相连的。只有这样才能在错误的赋值的情况下得到正确的代码。猜想是在debug时会有一个临时的变量堆栈,先把a放进去,再紧接着把b放进去,然后开始跑,而放到pat上时则与此不同。所以会报错。实在是有趣的bug。
本文深入解析在PAT在线评测系统中遇到的一个有趣Bug,涉及字符串与整数转换的细节。作者通过使用char数组处理大数并计算其各位数字之和,但在转换int到char时出现错误,使用sprintf函数时误将目标数组指定为输入数组,导致程序行为异常。文章详细分析了这一错误的原因,并探讨了debug环境下与实际运行环境的差异。
795

被折叠的 条评论
为什么被折叠?



