У вас большое количество проблем, Неопределенное поведение является наиболее критическим:
n -= 1;
for(i=0;i<=n;i++)
{
b[i]=a[n-i];
}
Когда i == n
, вы индексируете один за пределами вашего b[]
массива . Все массивы в C имеют нулевой индекс, поэтому ваши пределы l oop равны 0 <= i < n
. Используя i<=n
, вы l oop слишком много раз.
Вы не можете проверить возврат любого пользовательского ввода. Попробуйте ввести «один» или случайно набрать 'r'
вместо 4
и посмотрите, что произойдет. Вы должны проверять возврат для каждого пользовательского ввода и обрабатывать ошибку. Что произойдет, если пользователь введет 1, 2, 'r', 5
? Вы также должны очистить stdin
от любых посторонних символов, иначе они снова укусят вас при следующем вводе.
Не используйте conio.h
. Это делает ваш код на 100% непереносимым. Вы можете использовать функции из stdio.h
для своих нужд.
Тем не менее, когда вам нужно выполнять повторяющиеся задачи, такие как ввод целочисленных значений, напишите для этого короткую функцию. Вы можете написать такой, который принимает указатель на целое число для заполнения и указатель на приглашение для отображения и возвращает 0
в случае успеха или -1
, если пользователь отменяет ввод, создавая руководство EOF
с помощью Ctrl + d на Linux или Ctrl + z на windows. Вы можете добавить вспомогательную функцию в пустой stdin
, например
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
int getint (int *n, const char *prompt)
{
int rtn;
for (;;) {
fputs (prompt, stdout);
rtn = scanf ("%d", n);
if (rtn == EOF) {
fputs (" (user canceled input)\n", stderr);
return -1;
}
else if (rtn == 0) {
fputs (" error: invalid integer input.\n", stderr);
empty_stdin();
}
else
break;
}
empty_stdin();
return 0;
}
Остальная часть вашей программы для чтения массива в a[]
и обратного его в b[]
просто:
int main (void) {
int i = 0, n;
if (getint (&n, "Enter array parameter: ") == -1)
return 0;
int a[n], b[n];
for (i = 0; i < n; i++) {
char buf[128];
sprintf (buf, "enter value for a[%d]: ", i+1);
if (getint (&a[i], buf) == -1)
return 0;
}
for (i = 0; i < n; i++)
b[i] = a[n - 1 - i];
puts ("\nvalue of array b[]:");
for (i = 0; i < n; i++)
printf (" %d", b[i]);
putchar ('\n');
#if defined (_WIN32) || defined (_WIN64)
getchar(); /* hold terminal open on windows - type any char, hit return */
#endif
}
Пример использования / вывода
Все допустимые вводы:
$ ./bin/getarray
Enter array parameter: 5
enter value for a[1]: 5
enter value for a[2]: 4
enter value for a[3]: 3
enter value for a[4]: 2
enter value for a[5]: 1
value of array b[]:
1 2 3 4 5
Ошибки при вводе:
$ ./bin/getarray
Enter array parameter: foo
error: invalid integer input.
Enter array parameter: 5
enter value for a[1]: 5
enter value for a[2]: four
error: invalid integer input.
enter value for a[2]: 4
enter value for a[3]: 3
enter value for a[4]: I'm getting tired of this game...
error: invalid integer input.
enter value for a[4]: 2
enter value for a[5]: 1
value of array b[]:
1 2 3 4 5
Пользователь отменяет ввод :
$ ./bin/getarray
Enter array parameter: 5
enter value for a[1]: 5
enter value for a[2]: 4
enter value for a[3]: 3
enter value for a[4]: (user canceled input)
Посмотрите все и дайте мне знать, если у вас возникнут дополнительные вопросы.