程序跳过用户输入(C中的大型模块化库信息系统)

时间:2018-05-02 21:06:37

标签: c arrays struct string-formatting modularity

我目前正在编写我编写过的最大的C程序,用于我的一个大学模块的最终作业。该程序是模块化的,包含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函数,它与提供的学生大致相同,没有任何打嗝。< / p>

非常感谢任何帮助,希望这个问题可以在将来帮助其他人。谢谢你们和男孩们。

编辑添加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 :(得分:1)

编译器正在向您解释

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相同。