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

时间:2015-01-09 12:55:19

标签: c++ c

有一个功能,我自己写了很多数字'在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);
}

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

1 个答案:

答案 0 :(得分:3)

由于多次reasongs

,您的代码无效
  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. 也是如此
  4. 你正在从AddF()函数返回一个数组而不是一个指针,你可以使用一个临时数组,然后在最后复制字符串,并返回副本,不要使用全局变量解决问题

  5. 您正在分配给Result,如果使用strcat(),目标字符串将始终与源字符串的末尾相关联。

    这实际上是一个错误,因为你将Result声明为指针,并且你在其他地方指出了点,从而失去了对原始指针的引用。

  6. 这可能就是你想要的

    #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;
    }