|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我正在写一个图书管理系统(准确地说是: copy代码然后在屎山旁边拉一坨)
然后我考虑到每次要录入或者修改数据, 可能人家点进来之后就反悔了或者想回去查看以下数据, 这个时候就不能强制人家输入, 而是如果人家直接输入Return就回去
它的原代码如下
- void LibraryManager::Add_book(book **q)//增加图书信息
- {
- char m;
- std::cout << "请按照如下顺序输入图书信息! " << std::endl;
- book *p;//定义book类指针
- p = new book;//申请存储空尾间
- std::cout << "本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格" << std::endl;
- std::cin >> *p;
- if (*q == NULL)//检查链表是否为空链表
- {
- p->next = NULL;
- *q = p;
- }//如果链表为空则把链表头指向p
- else
- {
- p->next = NULL;//p是倒数第二个节点,next指针中保存这尾节点的地址值,p指向尾节点
- (zbook)->next = p;//如果链表不为空则把链表尾指向p
- }
- zbook = p;
- std::cout << "添加成功,是否继续添加:是Y,否N:" << std::endl;
- std::cin.clear();
- std::cin.ignore(1024, '\n');
- std::cin >> m;
- while ((m != 'Y'&& m != 'y' && m != 'N' && m != 'n') || std::cin.good() == FALSE)
- {
- std::cout << "输入错误,请重新输入:" << std::endl;
- std::cin.clear();
- std::cin.ignore(1024, '\n');
- std::cin >> m;
- }
- if (m == 'Y' || m == 'y')
- {
- Add_book(&abook);
- exit(EXIT_SUCCESS);
- }
- else if (m == 'N' || m == 'n')
- {
- std::cout << "正在返回到菜单,请勿操作" << std::endl;
- Sleep(1500);//停滞1.5s再继续
- system("cls");//清屏
- Menu();
- exit(EXIT_SUCCESS);
- }
- }
复制代码
然后我改之后的如下
- void LibraryManager::Add_book(book **q)//增加图书信息
- {
- //以下代码加入了输入Return就返回的功能, 但是有bug(输入之后会直接跳到错误)
- //我的想法是, 将用户输入的内容和"Return"对比, 如果一样就返回, 如果不一样就流给*p
- //但是, 没办法直接将ifReturn的内容流给*p(也可能是我不会)
- //然后我就想把第一个数据给赋值过去, 但是它会往后面串一个emm
- /*
- char m;
- std::cout << "请按照如下顺序输入图书信息, 如要返回请输入"Return!" " << std::endl;
- book *p;//定义book类指针
- p = new book;//申请存储空尾间
- std::cout << "本书登录号 本书书籍名称 本书作者姓名 本书分类号 本书出版单位 本书出版时间 本书书籍价格" << std::endl;
-
- std::string ifReturn;
- std::getline(std::cin, ifReturn);
- if ((ifReturn.compare("Return")) == 0)
- {
- std::cout << "正在返回到菜单,请勿操作" << std::endl;
- Sleep(1500);//停滞1.5s再继续
- system("cls");//清屏
- Menu();
- exit(EXIT_SUCCESS);
- }
- else
- {
- std::stringstream ss(ifReturn);
- std::cin.rdbuf(ss.rdbuf());
- }
- std::cin >> *p;
- if (*q == NULL)//检查链表是否为空链表
- {
- p->next = NULL;
- *q = p;
- }//如果链表为空则把链表头指向p
- else
- {
- p->next = NULL;//p是倒数第二个节点,next指针中保存这尾节点的地址值,p指向尾节点
- (zbook)->next = p;//如果链表不为空则把链表尾指向p
- }
- zbook = p;
- std::cout << "添加成功,是否继续添加:是Y,否N:" << std::endl;
- std::cin.clear();
- std::cin.ignore(1024, '\n');
- std::cin >> m;
- while ((m != 'Y'&& m != 'y' && m != 'N' && m != 'n') || std::cin.good() == FALSE)
- {
- std::cout << "输入错误,请重新输入:" << std::endl;
- std::cin.clear();
- std::cin.ignore(1024, '\n');
- std::cin >> m;
- }
- if (m == 'Y' || m == 'y')
- {
- Add_book(&abook);
- exit(EXIT_SUCCESS);
- }
- else if(m == 'N' || m == 'n')
- {
- std::cout << "正在返回到菜单,请勿操作" << std::endl;
- Sleep(1500);//停滞1.5s再继续
- system("cls");//清屏
- Menu();
- exit(EXIT_SUCCESS);
- }
- */
- }
复制代码
运行的时候, 就会无限出现: 输入错误请重试!
另外,明明都已经用了cin.clear();还有cin.ignore(100, '\n');了,为啥缓冲区的错误还是存在呢? |
|