黑马程序员课程中关于C++的cin函数被直接跳过机制的记录
今天,作者在跟学黑马程序员的C++课程的时候,在做通讯录管理的添加联系人的函数时,发现自己的程序不能像教程中一样添加完一名联系人后自动回到主界面,会进入一个死循环,下面是我的原始代码(错误一眼就能看出来,不过当时愣是没看出来)
#include <iostream>
#include "string"
using namespace std;
#define MAX 1000
struct Person
{
string m_name;
int m_sex;
int m_age;
string m_phone;
string add;
};
struct Addressbook
{
struct Person presonarr[MAX];
int size;
};
void showMenu()
{
cout << "1.添加联系人" << endl;
cout << "2.显示联系人" << endl;
cout << "3.删除联系人" << endl;
cout << "4.查找联系人" << endl;
cout << "5.修改联系人" << endl;
cout << "6.清空联系人" << endl;
cout << "7.退出通讯录" << endl;
}
void addperson(Addressbook* adb)
{
if (adb->size == MAX)
{
cout << "通讯录已满" << endl;
return;
}
else
{
string name;
cout << "请输入姓名" << endl;
cin >> name;
adb->presonarr[adb->size].m_name = name;
int sex = 0;
cout << "请输入性别" << endl;
cout << "1-男 2-女" << endl;
while (true) {
cin >> sex;
if (sex == 1 || sex == 2)
{
adb->presonarr[adb->size].m_sex = sex;
break;
}
else
cout << "输入有误,请重新输入" << endl;
}
int age = 0;
cout << "请输入年龄" << endl;
cin >> age;
adb->presonarr[adb->size].m_age = age;
int phone;
cout << "请输入电话" << endl;
cin >> phone;
adb->presonarr[adb->size].m_phone = phone;
int address;
cout << "请输入住址" << endl;
cin >> address;
adb->presonarr[adb->size].add = address;
adb->size++;
cout << "添加成功" << endl;
system("pause");
system("cls");
}
};
int main()
{
Addressbook adb;
adb.size = 0;
int select = -1;
while (true)
{
showMenu();
cin >> select;
switch (select)
{
case 1:
addperson(&adb);
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
cout << "欢迎下次使用" << endl;
system("pause");
return 0;
break;
default:
cout << "输入选项有误,请重新输入" << endl;
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
break;
}
}
system("pause");
return 0;
}
检查后
通过断点检查发现是自己的主函数中的while循环有问题,while中的select值第一次赋值完后,第二次进入循环不能进行赋值,会直接跳过cin,网上查到的cin是一个读取输入流的函数,当你的输入类型与定义类型不符时,它会关闭输入通道,后续的所有代码直接跳过所有的cin,所以一定是前面的输入第一个联系人时,输入类型的问题
再次检查后
有了目标,找出错误就快了,逐项检查后发现,果然添加联系人函数中的地址一栏,我把address定义成int了,啊呀,原来就是因为这个定义的问题,枉我找了半个小时的问题,自己太不仔细了
结论
当发现程序中的cin函数被直接跳过时,可能就是因为前面代码中有输入类型与变量定义类型不符造成的输入通道关闭,本小白也长了个教训,以后写代码,最简单的定义也要过过脑子,也通过这件小事明白了cin的一些机制,与大家分享一下,希望不要犯作者这样低级的错误。 (正确代码就是把源代码中的address的定义类型改成string)
|