Функции C str и malloc

#c #string #malloc

#c #строка #malloc

Вопрос:

Я хочу создать программу, которая суммирует большие целые числа в C. Итак, я готов с кодом. Компиляция программы успешно прошла с помощью компилятора mingw и Visual C . Но у меня проблема с частью запуска. Странно то, что когда я отлаживаю программу в Visual Studio, проблем нет, но когда я запускаю ее, мои окна показывают, что программа перестает работать. Это код :

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include "sum.h"

int isNumber(char* number)
{
    int lenght = strlen(number);
    int i,result = 0;
    for (i = 0 ; i < lenght ; i  )
    {
        if (isdigit(*number  ))
        {
            result = 1;
        }
        else
        {
            result = 0;
            break;
        }
    }
    return resu<
}
int cti(char ch)
{
    return ch - '0';
}
char* addZeros(char* number,int lenght)
{
    int num_lenght = strlen(number),size = abs(lenght - num_lenght),i;
    char* zeros = (char*)malloc(size);

    strcpy(zeros,"");
    zeros[size - 1] = '';
    for (i = 0 ; i < abs(lenght - num_lenght) ; i  )
    {
        strcpy(amp;zeros[i],"0");
    }
    strncat(zeros,number,size);
    number = (char*)malloc(sizeof(char)*size);
    strncpy(number,zeros,size);
    return number;
}
char* sum(char* numberOne,char* numberTwo)
{
    if (numberOne == NULL || numberTwo == NULL)
        return NULL;
    if (!isNumber(numberOne) || !isNumber(numberTwo))
        return NULL;

    int CF = 0;
    int lenghtOne = strlen(numberOne),lenghtTwo = strlen(numberTwo);
    if (lenghtOne == 0 || lenghtTwo == 0)
        return lenghtOne == 0 ? numberTwo : numberOne;
    int max = lenghtOne > lenghtTwo? lenghtOne : lenghtTwo,index;
    char* result = (char*)malloc(max);
    int res = 0;
    result[max] = '';
    if (lenghtOne > lenghtTwo) numberTwo=addZeros(numberTwo,strlen(numberOne));
    else if (lenghtOne < lenghtTwo) numberOne = addZeros(numberOne,strlen(numberTwo));
    for ( index = max - 1 ; index >=0 ; index--)
    {
        res = cti(numberOne[index])   cti(numberTwo[index]);
        if (((res%10)   CF) > 9) 
        {
            int num = ((res%10)   CF);

            result[index] = (char)((int)'0' num%10);
            CF = num / 10;
        }
        else
        {
            result[index] = (char)((int)'0' ((res%10)   CF));
            CF = res / 10;
        }
    }
    return resu<
}
int main(int argc, char *argv[])
{
    char* num = "12345678";
    char* num2= "2341";
    char* result = sum(num,num2);
    printf("%sn",result);
    return 0;
}
  

Я думаю, что проблема где-то в указателях, но я не совсем уверен в этом. Кто-нибудь может мне помочь?

Комментарии:

1. Итак, какую проблему вы видите, когда вы ее видите?

Ответ №1:

Объем памяти, который вы выделяете, недостаточен. Он не включает пробел для нулевого символа, завершающего строку, и не учитывает изменения длины результата для таких сумм, как «9» «1». Затем вы записываете завершающий символ null после конца массива.

Вы должны использовать malloc с такой длиной:

 char* result = (char*)malloc(max   2);
  

Комментарии:

1. @Джордан Борисов: это должно быть максимум 2. Вам нужно 1 для нулевого ограничителя и еще 1 для случаев, когда длина результата больше длины строк. Для примера, который я привел в своем ответе, «10» потребуется пробел для 3 символов, тогда как обе входные строки имеют длину 1. Поэтому оно должно быть max 2.

Ответ №2:

 result[max] = '';
  

Это неверно, поскольку вы выделили только максимальное количество символов для результата. Я не изучал логику подробно, но выделение максимум 1 символов решило бы эту конкретную проблему.