Сложение двух массивов

Я попытался добавить два массива символов или целые массивы. Он работает правильно только в том случае, если значения в массиве состоят из одной цифры. Если в одном или обоих массивах есть числа с двумя цифрами, я получил неправильный ответ.

Предполагать

//n = 3
a1[n] = "1 2 3"
a2[n] = "4 5 6"

Я использовал цикл while для добавления ...

while(sizeofarray > i)
{
  result[i]= atoi(&12[i]) + atoi(&a2[i]);
  i++;
}

И я получил правильный ответ.

Но если

a1[n] = "1 10 20"
a2[n] = "4 5 6"

результат сложения будет неправильным.

Какой правильный код для решения этой проблемы. Или хотя бы идея.


person Ali    schedule 14.11.2014    source источник
comment
Пожалуйста, покажите свой код, как вы все это вычисляете   -  person Rizier123    schedule 14.11.2014
comment
Перед операцией необходимо нормализовать.   -  person BLUEPIXY    schedule 14.11.2014
comment
{1, 10, 20} означало 11020 или 1*100 + 10*10 + 20*1 ?? Вы имеете в виду то же самое?   -  person BLUEPIXY    schedule 14.11.2014
comment
Кажется, у вас есть массив символов. Итак, это строка, которую вы назначаете массиву. Затем выполняем char путем добавления char. Итак, ваша интерпретация неверна.   -  person Gopi    schedule 14.11.2014
comment
Как temp1 и temp2 относятся к a1 и a2?   -  person lurker    schedule 14.11.2014
comment
@BLUEPIXY {1, 10, 20} означает, что первое значение в массиве равно 1, второе - 10 и последнее значение - 20.   -  person Ali    schedule 14.11.2014
comment
@lurker извини, я редактировал это   -  person Ali    schedule 14.11.2014
comment
Сообщать, что при вводе была ошибка, то отпугну.   -  person BLUEPIXY    schedule 14.11.2014


Ответы (2)


Каждый «элемент» строки C - это отдельный символ, а не «число» в том смысле, что «10» - это одно число. Например, эти объявления эквивалентны:

char a1[] = "1 10 20";
char a1[] = {'1', ' ', '1', '0', ' ', '2', '0', 0};
char a1[] = {49, 32, 49, 48, 32, 50, 32, 0};
/* The 0 at the end is the NUL terminator, which tells the C library
   that the string ends at that point */

Если вы создаете a1 и a2 как массивы, вы можете добавлять соответствующие элементы.

int a1[] = {1, 10, 20};
int a2[] = {4, 5, 6};

Но я предполагаю, что вам нужно анализировать их как строки, и вы не можете просто создавать массивы напрямую, например, считывая данные со стандартного ввода (обычно с клавиатуры) или из файла. Я вижу, вы используете функцию atoi для преобразования строки в число. Но функция atoi не возвращает, сколько цифр она проглотила. Таким образом, i++; пропустит слишком мало цифр, если не добавит однозначные числа. Кроме того, использование одной переменной (i) для хранения индекса в обеих строках работает только тогда, когда числа в каждой строке начинаются с одного и того же индекса, то есть когда каждый элемент имеет одинаковое количество цифр.

Чтобы исправить это, вам нужно сделать две вещи:

  1. Используйте отдельный указатель в каждый из массивов a1 и a2. Каждый указатель будет указывать на ту часть массива, которая уже была прочитана. Таким образом, после чтения двух целых чисел из каждой строки один указатель будет указывать на конец «10», а другой - на конец «5».
  2. Используйте strtol функцию, которая возвращает указатель на конец части. строки, которую прочитала функция. Затем вы можете использовать этот указатель, чтобы пропустить число, а затем (вручную) пропустить пробел, пока не достигнете следующей цифры (используйте isdigit) или терминатора NUL.
person Damian Yerrick    schedule 14.11.2014

У вас есть массив символов, и поэтому цифры, закодированные в строке символов, не распознаются как числа. Это имеет побочный эффект: ваша программа не находит и не выравнивает десятичные разряды во время процедуры сложения.

«10» + «3» даст что-то вроде строки «40», если вы не выровняете десятичные разряды вручную. Использование массивов целых чисел решило бы проблему, поскольку математические процедуры будут автоматически учитывать выравнивание десятичных разрядов для всех математических типов.

Чтобы решить эту проблему, вам необходимо выполнить процедуру

  1. Соберите все цифры первого числа.
  2. Соберите все цифры второго числа.
  3. (при условии, что вы не имеете дело с десятичными знаками) выполните сложение в обратном порядке (с разряда единиц вверх), перенося при необходимости.
person Edwin Buck    schedule 14.11.2014