c语言建立图书馆结构体指针的问题

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define MAX 1024

void login();
//void readermenu();
void managemenu();
void changebook();
void deletebook();
void inquirebook();
//void addbook();




void getInput(struct Book *book );
void printBook(struct Book *book);

void login()
{
	printf("欢迎进入图书管理系统登入页面!\n");
	printf("1.管理员登入界面\n");
	printf("2.用户登录界面\n");
	printf("3.退出\n");
	printf("请选择你的操作:");              //起始登录页面

	int choice;
	scanf("%d",&choice);

	if(choice==1)                           //选择菜单并调用相对函数
	{
		char username[10],password[10];
		printf ("请输入用户名和密码\n");
		printf("用户名:\n");
		scanf("%s",&username);
		printf("密码:\n");
		scanf("%s",&password);
		getchar();
		if((strcmp(username,"620")==0)&&(strcmp(password,"620")==0))         //管理员正确账号和密码均为620并用strcmp函数进行判断两个字符串是否相同
		{
			
			printf("进入管理员菜单\n");
			managemenu();

		}
		else
		{
			printf("密码错误,请重新输入:\n");
			return;
		}
		getchar();
	}

	else if(choice==2)
	{
		char name[10],readerpassword[10];
		printf ("请输入用户名和密码\n");
		printf("用户名:\n");
		scanf("%s",&name);
		printf("密码:\n");
		scanf("%s",&readerpassword);
		
		

		if((strcmp(name,"520")==0)&&(strcmp(readerpassword,"520")==0))
		{
			printf("进入读者菜单\n");
			//readermenu();
			return;
		}
		
		printf("密码错误,请重新输入:\n");
			return;
	}
		
	
	else (choice==3);
	{
		exit(0);
		
	}
}

void managemenu()
{
   int a=1;
   system("cls");            //清屏
   while(a)                  //定义非零常量a,使其在未选择返回的情况下一直处于菜单页面
   {
	   int choice;
       printf("1.查询图书信息\n");
	   printf("2.删除图书信息\n");
	   printf("3.修改图书信息\n");
	   printf("4.录入图书信息\n");
	   printf("5.返回\n");
	   printf("请选择你的操作\n");
	   scanf("%d",&choice);
	   switch(choice)
	   {
	   case 1: inquirebook();break;
	  // case 2: changebook();break;
	//   case 3: deletebook();break;
	   case 4: getInput;break;
	   case 5: a=0;break;               //将非零常a改为0,从而达到退出while循环目的		
	   
	   }

     }
   }	

 
void inquirebook()
{
	  FILE *fp;    //声明 fp 是 FILE型指针,用于指向FILE类型 (文件结构)
	  char buffer[MAX];
	  int ch;
	if((fp=fopen("library.txt","w"))==NULL)
		
	{
		printf("打开文件失败!\n");
	    exit(EXIT_FAILURE);  //表示没有成功的执行一个程序
	}

	fputs("书名:《人才》\n",fp);
	fputs("作者:小文哥\n",fp);
	fputs("售价:9999999.99\n",fp);
	fputs("出版社:清华大学出版社\n",fp);
	fputs("\n",fp);

	fclose(fp);

	if((fp=fopen("library.txt","r"))==NULL)
		
	{
		printf("打开文件失败!\n");
	    exit(EXIT_FAILURE);  //表示没有成功的执行一个程序
	}

	while(!feof(fp))
	{
		fgets(buffer,MAX,fp);
		printf("%s",buffer);
	}

	fclose(fp);

	return;
}


	struct Book
{   
	
	char title[128];
	char author[40];
	float price;
	
	char publisher[40];
};

void getInput(struct Book *book)
{
	printf("请输入书名:");
	scanf_s("%s",book->title);
    printf("请输入作者:");
	scanf_s("%s",book->author);
	printf("请输入售价:");
	scanf_s("%f",&book->price);
    printf("请输入出版社:");
	scanf_s("%s",book->publisher);
	void printBook(struct Book *book);
 }

void printBook(struct Book *book)
{
	printf("书名:%s\n",book->title);
    printf("作者:%s\n",book->author);
	printf("售价:%f\n",book->price);
    printf("出版社:%s\n",book->publisher);
}
	

管理员账号和密码均为620,进入管理员系统输入4录入图书信息。为什么还是弹出管理员菜单页面

我觉得是输入缓冲区的问题,因为你输入完数据,还会遗留一个回车符在输入缓冲区中,所以当有需要输入字符时,有优先从输入缓冲区中进行读取,才会导致出现那样得问题。

所以,解决办法是,清空输入缓冲区即可。如下代码

char c;
while ((c = getchar()) != '\n');

应该在void managemenu()这个函数里要加一个,具体哪里还有需要加,自己可以调试看看!

最后的主函数代码为

int main()
{
    login();
    
    system("pause");                     //从程序中发起系统命令行调用,执行命令:pause.system("PAUSE")  为暂停,等待用户信号;
    return 0;
}

105行getInput参数都没有肯定执行错误呀

void addbook(struct Book book){

}
void getInput()
{
    struct Book book;
    printf("请输入书名:");
    scanf("%s",book.title);
    printf("请输入作者:");
    scanf("%s",book.author);
    printf("请输入售价:");
    scanf("%f",&book.price);
    printf("请输入出版社:");
    scanf("%s",book.publisher);
    printBook( book);
    addbook(book);
}
void printBook(struct Book book)
{
    printf("书名:%s\n",book.title);
    printf("作者:%s\n",book.author);
    printf("售价:%f\n",book.price);
    printf("出版社:%s\n",book.publisher);
}

记得把你的函数声明部分也改掉;还有105行 case 4: getInput();break;

你的addbook(struct Book book)内部应该是把book信息写入文件中。

没看懂inquirebook()是干嘛的。

 

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y