


Создать массив структур (помогите найти ошибку)
Здравствуйте помогите найти ошибку.
Условие задачи:
При решении задач этого раздела необходимо разработать программу,
позволяющую работать со списком структурированных данных.
Хранение данных необходимо организовать в виде массива структур. В
программе должны быть реализованы следующие функции:
1) создание новой записи в списке;
2) вывод списка на экран в табличном виде;
3) поиск записей в списке;
4) удаление записи из списка.
Список сведений о численности студентов факультетов вузов
города. Каждая строка списка содержит наименование вуза,
наименование факультета, количество групп студентов (не более
десяти) и количество студентов в каждой группе. Обеспечить
поиск а) факультетов заданного вуза с суммарным количеством
студентов, не превосходящим заданного числа; б) вуза с
наибольшим числом факультетов.
Проблема возникает (строка 90), при создании новой записи в списке, т. к. для каждого факультета нужно написать несколько групп, и в каждой группе нужно указать кол-во студентов, я использовал для этого цикл for, но после ввода кол-ва факультетов, он вместо того чтобы запросить имя факультета сразу переходит к вводу кол-ва групп, после ввода кол-ва групп он так же перескакивает ввод имени группы и сразу перескакивает на ввод кол-ва студентов.
Что я сделал не так?
#include
#include
#include
#define MAX 100
struct addr {
char name[30];
char faculti[20];
char group[35];
unsigned int student;
} addr_list[MAX];
void init_list(void), enter(void);
void delet(void), list(void);
void search(void), searching(void);
int menu_select(void), find_free(void);
int main(void)
{SetConsoleOutputCP(1251);
char choice;
init_list(); /* инициализация массива структур */
for(;;) {
choice = menu_select();
switch(choice) {
case 1: enter();
break;
case 2: delet();
break;
case 3: list();
break;
case 4: search();
break;
case 5: searching();
break;
case 6: exit(0);
}
}
return 0;
}
/* Инициализация списка. */
void init_list(void)
{
register int t;
for(t=0; t<MAX; ++t) addr_list[t].name[0] = '\0';
}
/* Получения значения, выбранного меню. */
int menu_select(void)
{
char s[80];
int c;
printf("1. Введите вуз\n");
printf("2. Удалите вуз\n");
printf("3. Выведите список\n");
printf("4. Поиск факультетов заданного вуза с суммарным количеством студентов, не превосходящим заданного числа\n");
printf("5. Поиск вуза с наибольшим числом факультетов\n");
printf("6. Выход\n");
do {
printf("\nВведите номер нужного пункта: ");
gets(s);
c = atoi(s);
} while(c<0 || c>6);
return c;
}
/* Ввод вуза в список. */
void enter(void)
{
int slot,k,l,i,m;
char s[80];
slot = find_free();
if(slot==-1) {
printf("\nСписок заполнен");
return;
}
printf("Введите имя вуза: ");
gets(addr_list[slot].name);
printf("Введите кол-во факультетов: ");
scanf("%d",&l);
for(m=1;m<=l;m++){
printf("Введите имя %d-го факультета: ",m);
gets(addr_list[slot].faculti);
printf("Введите кол-во групп: ");
scanf("%d",&k);
for(i=1;i<=k;i++){
printf("Введите имя %d-й группы: ",i);
gets(addr_list[slot].group);
printf("Введите количество студентов %d-ой группы: ",i);
gets(s);
addr_list[slot].student = strtoul(s, '\0', 10);
}
}
}
/* Поиск свободной структуры. */
int find_free(void)
{
register int t;
for(t=0; addr_list[t].name[0] && t<MAX; ++t) ;
if(t==MAX) return -1; /* свободных структур нет */
return t;
}
scanf и gets реализуют несколько различные концепции ввода. В данном случае проблема в том, что scanf читает из буфера ввода только нужные ему символы, в данном случае - цифры ("%d"), а символ перевода строки оставляет в буфере; а gets читает символы до перевода строки, т. е. как раз один перевод и считывает. Как решить проблему: самое простое - при смене метода ввода чистить буфер клавиатуры: http://pastebin.com/4JSWEEp9 (на будущее - код лучше именно на этот сайт выкладывать).