将字符串相关函数从 C++ 转换为 C
Converting String Related Function from C++ to C
有一个函数,我自己为大数字编写了它' C++ 中的 Add (+) 运算符,现在我正在尝试将其转换为 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);
}
当它到达最后一行时,它将崩溃。
由于多种原因,您的代码不起作用
-
您必须分配
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] = ' ';
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] = ' ';
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] = ' ';
}
result = AddF(numbers[0], numbers[1]);
if (result != NULL)
{
printf("%sn", result);
free(result);
}
if (numbers[0] != NULL)
free(numbers[0]);
if (numbers[1] != NULL)
free(numbers[1]);
return 0;
}
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 了解 GLM- openGL 中的相机转换
- 将无符号char*转换为std::istream*C++