C/C++

Программирование на C

Почему прога требует вписать значение в пустой строчке(между a[1] и a[2])?#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void)
{int x,n,a1;
int a[n];
printf("Napishite razmer massiva\n");
scanf("%d",&n);
for (x=0;x<n;x++)
{printf("a[%d] -> ",x+1);
scanf("%d\n",&a1);};
return 0;}
 scanf("%d", &a1); 
Без \n
Сергей Неважно
Сергей Неважно
83 247
Лучший ответ
Дмитрий Мальчивитский Почему он только 1 раз такое выдавал?
Вам надо было бы задаться другим вопросом: почему эта чудесная программа вообще, в принципе, хоть как-то работает. Ибо если вам кажется, что с ней все нормально то это вам лишь только кажется.
Когда мы пишем определение массива ВНУТРИ функции, то место под него отводится В СТЕКЕ и размер этого места должен быть известен на момент создания массива.
Вот этот вот кусок
 int a[n];  
printf("Napishite razmer massiva\n");
scanf("%d",&n);
зто просто лютый трэш. Вы, вероятно, думаете, что таким образом смогли задать размер массива, но на самом деле это не так. Если вам нужен какой-то кусок памяти, размер которого заранее вам неизвестен, то этот кусок (в большинстве случаев) надо выделить из кучи. Для этого в Си используется функция malloc. Когда надобность в выделенной памяти отпала, ее нужно освободить при помощи free. Вот переделка вашей программы с учетом вышеизложенного:
 #include   
#include

int main(void)
{
// Размер массива
int n;
// Указатель на кусок памяти для хранения массива
int* a = NULL;
int i;
printf("Введите размер массива: ");
// Богомерзкая scanf возвращает число правильно введенных значений
if( scanf("%d",&n) == 1 )
{
// Выделим кусок памяти под массив из n чисел типа int
a = (int*)malloc( sizeof(int)*n );
if( a )
{
i = 0;
while( i < n )
{
printf("a[%d] -> ", i);
if( scanf("%d", &a[i]) == 1 )
{
i++;
}
else
{
// Надо "съесть" кривые символы, иначе scanf "подавится"
// и произойдет зацикливание
while( !feof(stdin) )
{
if( fgetc(stdin) == '\n' ) break;
}
printf( "Введите целое число а не мусор!\n" );
}
}
printf( "Содержимое массива:\n" );
for( int i = 0; i < n; i++ )
{
printf("a[%d] = %d\n", i, a[i]);
}
// Освобождение куска памяти
free(a);
}
else
{
// Обработка ошибки выделения памяти
perror("malloc");
}
}
else
{
printf( "Ошибка ввода размера массива!\n" );
}
return 0;
}
PP
Plastek Plastek
9 624
Дмитрий Мальчивитский Можешь по проще объяснить? У меня в банальном месте проблемы, а ты мне про "кривые символы", malloc, perror. И, заодно, расскажи почему у меня все работает, хотя все не правильно