Программа пропускает ввод пользователя (Большая модульная библиотечная информационная система на C) - PullRequest
0 голосов
/ 03 мая 2018

В настоящее время я нахожусь в процессе программирования самой большой программы на Си, которую я когда-либо писал, для окончательного задания по одному из моих университетских модулей. Программа является модульной и содержит файлы, такие как main.c, librarian.c, Students.c и books.c. У каждого есть свой соответствующий заголовочный файл, и у меня также есть файл structs.h, содержащий две структуры: одну для книг и одну для студентов.

В настоящее время я сталкиваюсь с проблемой, когда библиотекарь пытается добавить в библиотеку новое членство студента, некоторые входные данные полностью пропускаются, и я не понимаю, почему.

Я постараюсь включить как можно меньше кода, но это может быть проблемой из-за размера моей программы.

Во-первых, вот структура моего студента, которая может иметь отношение к делу:

struct STUDENT             //Structure variable for student
{
  int id;
  char *name[20];
  char *pass[20];
  int mobile;
  float fee;
  int age;
  char *cat;
};
struct STUDENT student;

Теперь функция, которая вызывает у меня проблемы, такова:

int student_data(int answer){ //Function to add data of student to LIS
    student_confirm();
    int x = 15, x1 = 30;
    int student_ID;
    gotoxy(x,7);printf("Enter the Information Bellow");
    gotoxy(x,10);printf("Student Name:");  gotoxy(x1,10);scanf(" %d",&student_ID);

    if(student.id==student_ID){
        gotoxy(x,11);printf("Id is already Exits");
        getch(); add_student();
    }

    student.id=student_ID;
    gotoxy(x,11);printf("User Name:");gotoxy(x1,11);scanf("%s",&student.name);       
    gotoxy(x,12);printf("Password:");gotoxy(x1,12);scanf("%s",&student.pass);
    gotoxy(x,13);printf("Mobile:");gotoxy(x1,13);scanf("%d",&student.mobile);
    gotoxy(x,14);printf("Fee:");gotoxy(x1,14);scanf("%f",&student.fee);        
    gotoxy(x,15);printf("Age:");gotoxy(x1,15);scanf("%d",&student.age);      

    return 1;
}

Функция student_confirm () просто спрашивает пользователя, уверены ли они, что хотят добавить нового ученика в библиотеку. Теперь, когда я запускаю программу, я вхожу в систему как библиотекарь, иду, чтобы добавить студента, и меня приветствуют в консоли

                        *****Library Information System*****
                        ***Brotherton Library***
                                *1975*
                ____________________________________________
    Confirm you would like to add a new student: (Y/N)

           Enter the Information Bellow


           Student Name:
           User Name:
           Password:

Он пропускает прямо к паролю, не позволяя мне ввести предыдущие два поля. Я полностью озадачен этим. В моей программе есть похожие части кода (например, для добавления книг), которые следуют той же логике, и они работают просто отлично. Я не смог ничего найти через поиск здесь.

Теперь я программирую на C около 6 месяцев, поэтому я определенно начинающий. Я становлюсь немного опытным, но есть так много всего, что я могу выучить, и так много, чего я не знаю о языке.

Предупреждения, которые я получаю:

    warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char * (*)[20]' [-Wformat=]|

для обоих пропущенных полей. Это потому, что массивы являются технически указателями? Я попытался изменить несколько вещей вокруг, но, как я сказал, моя структура книг использует ту же логику, что и у студентов, и у меня есть функция add_books, которая более или менее такая же, как и у студентов, которая работает без каких-либо сбоев.

Любая помощь будет принята с благодарностью, и, надеюсь, этот вопрос может помочь другим в будущем. Спасибо, ребята и девочки.

отредактировано для добавления функции student_confirm ():

int student_confirm(){ //Function to confirm adding of student
  int x = 10;
  char answer;
  system("cls");window();
  printf("\n\n\n");
  gotoxy(x,5);printf("Confirm you would like to add a new student: (Y/N)");
  if(getch() == 'y' || answer == 'Y')
  student_data(answer);

 return 1;

}

1 Ответ

0 голосов
/ 03 мая 2018

Компилятор объясняет это вам

warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char * (*)[20]'

char *name[20];

- это массив указателей на char, вместо этого вам нужен массив char:

char name[20];

или указатель на char:

char *name;

...
student.name = malloc(20);

, а затем

scanf("%s", student.name); 

Обратите внимание, что вам не нужно использовать адрес оператора (&) с scanf("%s", student.name), потому что student.name уже (или распадается) на указатель.

То же самое для pass.

...