我目前正在编写我编写过的最大的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;
}
答案 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
相同。