- 发现问题:代码在本地正常运行,交到OJ上AC50%,通过测试样例发现了部分数据存在问题
- 测试样例(部分)1
- 测试样例(部分)2
- 测试样例(部分)3
-
对存在问题的部分数据进行调试观察运行过程,发现dev中输入新的字符串时并没有对原数组完全清零,只是在当前输入的字符串末尾添加了终止符,且源代码对数组是否读取完的判断是依次判断数组是否为0~9的字符,导致读取了’\0’后的数据。
-
高精加法源代码(增加了memset对数组清零)
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
char a[505], b[505],ans[505];
void daoxu(char temp[505], int len)
{
for (int i = 0; i <len/2 ; i++)
{
char tem = temp[i];
temp[i] = temp[len - 1 - i];
temp[len - 1 - i] = tem;
}
}
int main()
{
while (~scanf_s("%s%s", &a, 60, &b, 60))
{
memset(ans, 0, sizeof(ans));
int lena = strlen(a);
int lenb = strlen(b);
daoxu(a, lena);
daoxu(b, lenb);
int i =0, jinwei = 0;
while ((a[i] >= '0'&&a[i]<='9') || (b[i] >= '0' && b[i] <= '9') || jinwei != 0)
{
int x = jinwei;
if (a[i] >= '0' && a[i] <= '9')
x += a[i] - '0';
if(b[i] >= '0' && b[i] <= '9')
x+= b[i] - '0';
jinwei = 0;
if (x > 9)
{
jinwei = 1;
x -= 10;
ans[i] = x+'0';
}
else
ans[i] = x + '0'+jinwei;
i++;
}
int lenans = strlen(ans);
daoxu(ans, lenans);
daoxu(a, lena);
daoxu(b, lenb);
//printf("%s", ans);
printf("%s + %s = %s\n", a,b,ans);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));//奇怪的bug,dev和Oj必须清零,否则读取部分数据会有多的数据。
//for (int m = 0; m <= lenans; m++)
//printf("%c", ans[m]);
//printf("\n");
}
}
- 进一步使用以下代码验证
#include<stdio.h>
char a[60];
int main()
{
while (scanf("%s", &a) != EOF)
printf("a=%s,a[0]=%c,a[1]=%c,a[2]=%c,a[3]=%c,a[4]=%c,a[5]=%c,a[6]=%c\n",a,a[0],a[1],a[2],a[3],a[4],a[5],a[6]);
}
- devc运行结果
- vs运行结果