У вас есть ряд явных проблем, но основная проблема заключается в использовании вами различных размеров шрифта в swap
, например.
void swap (double *a, double *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
Вы предоставляете тип double
в качестве параметра (обычно 8-байтовое значение), но затем используете int temp;
(обычно 4-байтовое значение) в качестве временного указателя. Таким образом, даже если у вас все остальное правильно, вы сохраняете только первые 4 байта *a
в temp
.
Далее, вы в конечном итоге дважды меняете местами (заканчиваете тем же, с чего начали), если развернетесь по всему диапазону 0 < size
. Вместо этого вы хотите поменять местами каждый конечный элемент в диапазоне 0 < size / 2
. Например:
void reverseArray(double numbers[], size_t size){
for (size_t i = 0; i < size / 2; i++)
swap (&numbers[i], &numbers[size - i - 1]);
}
( примечание: счетчики обычно должны быть size_t
вместо int
(у вас не может быть отрицательного числа строк))
Далее вам нужно исправить scanf
валидацию. scanf() != 0
позволяет scanf() = EOF
проверить TRUE
, что явно не то, что вы хотите. Вы проверяете возврат по количеству спецификаторов преобразования , например
size_t readIntoArray(double numbers[]) {
double in;
size_t i = 0;
while (i < MAX_SIZE && scanf("%lf", &in) == 1) { /* <== here */
numbers[i] = in;
i++;
}
return i;
}
В целом, и рефакторинг кода, чтобы избежать необходимости в прототипах функций, вы можете сделать:
#include <stdio.h>
#define MAX_SIZE 128
size_t readIntoArray(double numbers[]) {
double in;
size_t i = 0;
while (i < MAX_SIZE && scanf("%lf", &in) == 1) {
numbers[i] = in;
i++;
}
return i;
}
void swap (double *a, double *b){
double temp;
temp = *a;
*a = *b;
*b = temp;
}
void reverseArray(double numbers[], size_t size){
for (size_t i = 0; i < size / 2; i++)
swap (&numbers[i], &numbers[size - i - 1]);
}
void printArray(double numbers[], size_t size){
int i = 0;
while (size--)
printf("%g ", numbers[i++]);
putchar ('\n');
}
int main(void) {
double numbers[MAX_SIZE] = { 0 };
size_t size = readIntoArray(numbers);
reverseArray (numbers, size);
printArray (numbers, size);
return 0;
}
Пример использования / Вывод
$ echo "4 8 15 7" | ./bin/revarrswap
7 15 8 4
Посмотрите вещи и дайте мне знать, если у вас есть вопросы.