有一个功能,我自己写了很多数字'在C ++中添加(+)运算符,现在我试图将其转换为C语言但是字符串存在一些问题:(我尝试了很多东西,但似乎它不起作用,这是我的一段代码在C ++中:
#include <iostream>
#include <stdlib.h>
using namespace std;
string num1,num2,Result;
string AddF (string num1, string num2)
{
string Result;
char d;
int sum,f=0,Len1=num1.length(),Len2=num2.length();
while(Len1>=0 || Len2>=0)
{
sum=0;Len1--;Len2--;
if (Len1>=0)
sum+=num1[Len1]-'0';
if (Len2>=0)
sum+=num2[Len2]-'0';
d=((sum+f)%10)+'0';
Result=d+string(Result);
f=(sum+f)/10;
}
d=f+'0';
if (f!=0)
Result=d+string(Result);
if(Result[0]=='0')
Result.erase(0,1);
return Result;
}
int main()
{
cout << "Please Enter 1th Number: "; cin >> num1;
cout << "Please Enter 2th Number: "; cin >> num2;
Result=AddF(num1,num2);
}
现在我在C中的转换代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *num1,*num2,*Result;
char* AddF (char *num1, char *num2)
{
char *Result,*d;
int sum,f=0,Len1=strlen(num1),Len2=strlen(num2),Temp;
while(Len1>=0 || Len2>=0)
{
sum=0;Len1--;Len2--;
if (Len1>=0)
sum+=num1[Len1]-'0';
if (Len2>=0)
sum+=num2[Len2]-'0';
Temp=((sum+f)%10);
itoa(Temp,d,10);
strcat(d,Result);
Result=d;
f=(sum+f)/10;
}
itoa(f,d,10);
if (f!=0)
{
strcat(d,Result);
Result=d;
}
if(Result[0]=='0')
memmove(&Result[0], &Result[0 + 1], strlen(Result) - 0);
return Result;
}
int main()
{
printf ("Please Enter 1th Number: "); scanf ("%s",&num1);
printf ("Please Enter 2th Number: "); scanf ("%s",&num2);
Result=AddF(num1,num2);
}
当它到达最后一行时会崩溃。
答案 0 :(得分:3)
由于多次reasongs
,您的代码无效您必须分配d
。我建议您将d
声明为数组并使用snptrinf
或_snprintf
函数,例如
char d[32];
int x = 3;
snprintf(d, sizeof(d), "%d", x);
你必须将分配的内存缓冲区传递给scanf
,你可以传递一个数组,比如
char num1[32];
char num2[32];
scanf("%31s", num1);
scanf("%31s", num2);
Result
你正在从AddF()
函数返回一个数组而不是一个指针,你可以使用一个临时数组,然后在最后复制字符串,并返回副本,不要使用全局变量解决问题。
您正在分配给Result
,如果使用strcat()
,目标字符串将始终与源字符串的末尾相关联。
这实际上是一个错误,因为你将Result
声明为指针,并且你在其他地方指出了点,从而失去了对原始指针的引用。
这可能就是你想要的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *AddF (char *number0, char *number1)
{
char *result;
int sum;
int carry;
int lengths[2];
int count;
if ((number0 == NULL) || (number1 == NULL))
return NULL;
lengths[0] = strlen(number0);
lengths[1] = strlen(number1);
result = malloc(lengths[0] + lengths[1] + 1);
if (result == NULL)
return NULL;
carry = 0;
count = 0;
while (lengths[0] >= 0 || lengths[1] >= 0)
{
lengths[0]--;
lengths[1]--;
sum = 0;
if (lengths[0] >= 0)
sum += number0[lengths[0]] - '0';
if (lengths[1] >= 0)
sum += number1[lengths[1]] - '0';
memmove(result + 1, result, ++count);
result[0] = ((sum + carry) % 10) + '0';
carry = (sum + carry) / 10;
}
result[count] = '\0';
if (result[0] == '0')
memmove(result, result + 1, count);
if (carry == 0)
return result;
memmove(result + 1, result, ++count);
result[0] = carry + '0';
result[count] = '\0';
return result;
}
int main()
{
char *numbers[2] = {NULL, NULL};
char *result;
size_t i;
for (i = 0 ; i < sizeof(numbers) / sizeof(*numbers) ; i++)
{
char chr;
size_t length;
length = 0;
printf ("Please Enter %ldth Number: ", 1 + i);
while ((chr = getchar()) != '\n')
{
char *number;
number = realloc(numbers[i], (2 + length));
if (number == NULL)
{
if (numbers[0] != NULL)
free(numbers[0]);
if (numbers[1] != NULL)
free(numbers[1]);
return -1;
}
number[length] = chr;
numbers[i] = number;
length += 1;
}
numbers[i][length] = '\0';
}
result = AddF(numbers[0], numbers[1]);
if (result != NULL)
{
printf("%s\n", result);
free(result);
}
if (numbers[0] != NULL)
free(numbers[0]);
if (numbers[1] != NULL)
free(numbers[1]);
return 0;
}