【发布时间】:2020-07-11 16:59:24
【问题描述】:
我编写了以下程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* reversenew(char*);
char* reverseold(char*);
char* add(char*,char*);
char* standard(char*);
int main()
{
int i,n;
char *num1, *num2;
num1 = malloc(1000*sizeof(char));
num2 = malloc(1000*sizeof(char));
printf("Enter the numbers to be added\n");
gets(num1);
gets(num2);
printf("\n%s\n",add(num1,num2));
return 0;
}
char* reversenew(char* m)
{
char *k;
k = malloc(100*sizeof(char));
strcpy(k,m);
int i,n = strlen(k);
for(i = 0;i<n;i++)
k[i] = m[n-i-1];
return(k);
}
char* reverseold(char* m)
{
char temp;
int i,n = strlen(m);
for(i=0;i<n/2;i++)
{
temp = m[i];
m[i] = m[n-i-1];
m[n-i-1] = temp;
}
return m;
}
char* add(char* num1,char* num2)
{
char *n1,*n2;
int i,digit,carry = 0;
n1 = reversenew(standard(num1));
n2 = reverseold(standard(num2));
int n = (strlen(n1)>strlen(n2))?strlen(n1)+1:strlen(n2)+1;
while(strlen(n1)!=strlen(n2))
(strlen(n1)>strlen(n2))?(n2 = strcat(n2,"0")):(n1 = strcat(n1,"0"));
n1 = strcat(n1,"0");
n2 = strcat(n2,"0");
for(i=0;i<n;i++)
{
digit = (int)n1[i]+(int)n2[i]+carry-96;
n1[i] = (char)(48+(digit%10));
carry = digit/10;
}
n1 = reverseold(n1);
n2 = reverseold(n2);
if(n1[0] == 48)
n1++;
strcpy(n2,standard(n2));
return(n1);
}
char* standard(char* m)
{
int i = 0;
while(i < strlen(m))
{
if(m[0] == 48)
m+=1;
else
break;
}
return m;
}
add 函数将两个自然数以字符串形式相加,并以字符串形式返回结果。此函数提供所需的输出,然后对于小输入以返回值 0 退出,对于大输入以返回值 3221226356 退出(例如,对于长度为 140 的输入字符串)。我取了 9 重复 140 次,被加到同一个数上。
请注意,reversenew 函数反转字符串并将结果存储在新字符串中,保持原始可重复使用,而 reverseold 函数反转原始字符串。
此外,如果我在上一行之后的return 0; 之前编辑并输入printf("\n5");,则它会按预期打印在输出窗口中,因此,我得出结论add 函数工作正常。
请帮我解决问题。
【问题讨论】:
-
请在您的问题中显示一些可以重现问题的示例输入。 (你输入了哪些数字?)
-
@Bodo,添加 140 乘以 9 和 140 乘以 9(已编辑并包括在内)。
-
k = malloc(100 * sizeof(char));。您希望这如何处理超过 99 的字符串?
标签: c string pointers add dynamic-memory-allocation