Доступ и сохранение значения по индексу в указателе

#c

#c

Вопрос:

У меня есть задание, в котором я должен суммировать целые числа до 100 цифр.

Они дали мне эту структуру для представления больших чисел (я думаю, что есть лучшие способы представить это, но мне не разрешено его изменять):

 typedef struct {
  char* string;
  int lengthError;
} BigNumber;
  

Где string — само число и lengthError длина числа или ошибка, которая является ранее определенным перечислением.

У меня также есть реализация функции sum

 BigNumber *sum(BigNumber* num1, BigNumber* num2) {
    BigNumber* result = malloc(sizeof(BigNumber));
    int limit = getLength(num1->lengthError, num2->lengthError);
    result->string = malloc(limit);
    int digitResu<
    int index = limit -1;
    int carry = 0;

    while(index != -1) {
        int d1 = ((int)num1->string[index]) - ((int)'0');
        int d2 = ((int)num2->string[index]) - ((int)'0');
        digitResult = d1   d2   carry;

        if (digitResult > 9) {
            digitResult = digitResult - 10;
            carry = 1;
        } else {
            carry = 0;
        }

        itoa(digitResult, amp;result->string[index], 10); //I think this is the problem
        index--;
    }

    result->string[limit] = '';
    printf("result: %sn", result->string);
    return resu<
}
  

Я не закончил писать эту функцию, я знаю, что в ней много недостатков, но проблема в том, что я не могу получить сумму 12 12. Результат, который я получаю, равен 2.

Я думал подойти к этой проблеме, выбрав последний символ обоих чисел, преобразовать их в an int и суммировать их, имея в виду цифру переноса. После того, как я получил результат, digitResult я пытаюсь преобразовать его в символ и сохранить его в соответствующей позиции result->string указателя

Как только он завершит операцию, я добавляю в последнюю позицию result->string .

Итак, вопрос в том, как мне заставить эту операцию работать по желанию? Отлаживая код, я заметил, что при первом сохранении первого результата в result->string, следуя приведенному выше примеру, это будет число 4, вместо этого он сохраняет мусор в этой позиции. Во втором добавлении я правильно сохраняю число 2, и это конечный результат, который я получаю при печати результата.

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

1. Что такое resultado ?

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

3. Вы уверены, что и num1->string[limit-1] то, и num2->string[limit-1] другое не находятся вне зоны досягаемости?

4. Забудьте об itoa. Если ((int)num1->string[index]) - ((int)'0'); преобразовать из ASCII в целое число, то, естественно, вы можете сделать '0' , чтобы пойти наоборот.

5. Требуют ли ваши инструкции, чтобы вы использовали struct BigNumber их повсюду, или вам будет разрешено использовать более эффективные процессы для выполнения суммы от 1 до 100, а затем просто преобразовать ее обратно в один BigNumber раз в конце? Или это было бы мошенничеством в этой ситуации?

Ответ №1:

Ваше использование itoa функции является проблемой (хотя, как вы также предположили, возможно, не единственной).

itoa Функция преобразует свой первый аргумент в строку с нулевым завершением — таким образом, помимо записи символьного представления digitResult в указанном месте строки, она также добавляет '' символ после него. Таким образом, ваша строка всегда будет заканчиваться сразу после последней введенной вами цифры, а 12 12 , дающий 24 , будет казаться только первым символом : 2 .

Вместо этого вы можете самостоятельно преобразовать цифру (изменив операцию, которую вы использовали для получения значений d1 and d2 ), а затем просто напрямую присвоить элементу string преобразованную цифру.

Итак, вместо:

     itoa(digitResult, amp;result->string[index], 10);
  

использование:

     result->string[index] = (char)(digitResult   '0');