Поскольку это домашнее задание, я сделаю несколько общих замечаний и надеюсь, что это не только поможет вам в решении вашей проблемы, но и улучшит ваш стиль программирования.
Ваш код содержит:
if(size == 1 && size % 2 != 0)
size++;
Если size
равно 1, size % 2
также будет равно 1, и поэтому ваша вторая проверка всегда верна. Эффект двух строк, как если бы вы написали:
if (size == 1)
size = 2;
Я сомневаюсь, что это то, что вы хотите.
Учитывая постановку задачи, ваша переменная input
будет хранить элементы n
или n+1
, где n
- это число чисел, которое вы хотите добавить, и равно argc-1
.
В C целочисленное деление усекается, поэтому 1/2
равно 0
, 5/2
равно 2
и т. Д. Математически, 5/2
равно 2,5, конечно. В приведенных ниже утверждениях я различаю «С» и истинное математическое видение, написав //
для последнего.
Теперь для выходного массива вы хотите n//2
элементов, если n
четное, и (n+1)//2
элементов, если n
нечетное. Из-за упомянутого выше свойства целочисленного деления вы можете убедиться, что ваш выходной массив всегда будет содержать (n+1)/2
элементов.
Если вы не заботитесь о том, чтобы тратить впустую один элемент, для своего ввода вы всегда можете выделить n+1
элементов, а затем установить n+1
th элемент в ноль, прежде чем начинать читать числа из команды. Строковые аргументы. Это имеет следующие преимущества:
- Не нужно беспокоиться о четном или нечетном количестве чисел в остальной части вашей программы,
- Вам не нужно
calloc()
: вы просто устанавливаете последний элемент на ноль. Остальные элементы будут записаны, и последний элемент, который вы установили на ноль, будет перезаписан, если у вас будет четное количество элементов.
Теперь о вашем realloc()
звонке:
input = (int*)realloc(NULL,(argc));
У этого есть следующие "проблемы":
realloc(NULL, size)
эквивалентно malloc(size)
, поэтому вы должны заменить realloc()
на malloc()
.
- Вам не нужно приводить возвращаемое значение из
malloc()
, calloc()
и realloc()
. На самом деле, приведение может скрыть ошибки от невозможности включения stdlib.h
.
- Вам нужно
argc
раз sizeof(int)
байт, а не argc
. Два будут равны, только если sizeof(int)
равно 1.
- Учитывая указатель
T *p;
, мне проще написать malloc()
вызовов как p = malloc(n * sizeof *p);
- это проще для написания, проще для чтения и не зависит от типа p
.
Итак, внеся вышеуказанные изменения, вы получите:
size_t n = argc - 1; /* number of inputs */
input = malloc((n+1) * sizeof *input);
atoi()
не проверяет ошибки: если вы узнали о strtol()
, вы должны использовать это.
Когда вы складываете числа вместе, вы можете сделать:
count := 0
while count < n:
output[count/2] := input[count] + input[count+1]
count := count + 2