将字符串相关函数从 C++ 转换为 C

Converting String Related Function from C++ to C

本文关键字:C++ 转换 函数 字符串      更新时间:2023-10-16

有一个函数,我自己为大数字编写了它' 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);
}

当它到达最后一行时,它将崩溃。

由于多种原因,您的代码不起作用

  1. 您必须分配d.我建议您将d声明为数组并使用类似 snptrinf_snprintf 函数

    char d[32];
    int  x = 3;
    snprintf(d, sizeof(d), "%d", x);
    
  2. 您还必须将分配的内存缓冲区传递给scanf,您可以传递一个数组,例如

    char num1[32];
    char num2[32];
    scanf("%31s", num1);
    scanf("%31s", num2);
    

    Result也是如此

  3. 你从 AddF() 函数返回一个数组而不是指针,你可以使用一个临时数组,然后在末尾复制字符串,然后返回副本,不要使用全局变量解决问题

  4. 如果不必要地分配给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;
}