В программе несколько ошибок
Массив, переданный в scanf
, неверен.
fflush(stdin)
не- стандартный, хотя Windows поддерживает его, он не переносится. Но вы не используете Windows, потому что он не поддерживает VLA char materia[V][50];
Новые строки, на которых остановится формат scanf
"%[^\n]"
, уже являются следующими во входном буфере.
Возвращаемое значение из scanf
не проверялось. Это количество успешно отсканированных элементов.
У вас может быть переполнение буфера, потому что длина входной строки не ограничена.
Вот скорректированный код:
#include<stdio.h>
int main(int argc, const char *argv[]){
int i;
int V;
printf("Enter number of Materi: ");
if(scanf("%d", &V) != 1) {
/* add some error message */
return 1;
}
// fflush(stdin); // removed
//Insert materia
char materia[V][50];
for(i = 0; i < V; i++){
printf("Materia %d name : ", i+1);
// add a space to filter the newline
// correct the array passed
// and restrict the length to prevent buffer overflow
if(scanf(" %49[^\n]", materia[i]) != 1) {
/* add some error message */
return 1;
}
// fflush(stdin); // removed
}
for(i = 0; i < V; i++){
printf("Materia - %d: %s\n", i+1, materia[i]);
}
return 0;
}
О новых строках. Спецификации формата %d
и %s
и %f
автоматически отфильтровывают начальные пробелы, но %c
и %[]
и %n
этого не делают. Функции scanf
останавливаются на первом символе, который они не могут преобразовать, который остается во входном буфере. %[^\n]
говорит ему остановиться на первой новой строке. Но он уже есть, из первого %d
scanf, и его необходимо удалить, также в последующих итерациях, и добавление пространства выполняет эту работу. Попытка удалить его после этого неуклюжа и не гарантирует работы.
Вы должны проверять возвращаемое значение из scanf
каждый раз, когда оно используется. Это количество успешно отсканированных элементов. Здесь должно быть 1
в обоих случаях. Поэтому, если у вас есть два элемента в одном операторе, его возвращаемое значение должно быть 2
.