#include [i]
using namespace std;
#include
#include // 定义 pause 函数以及 getValidInput 函数中使用
#define MAX 1000 // 通讯录最大人数
void showMenu ();
void pause ();
int getValidInput ();
// 联系人结构体
struct Person {
string m_Name;
int m_Gender;
int m_Age;
long m_Phone;
string m_Address;
};
// 通讯录结构体
struct Addressbooks {
struct Person personArray[MAX];
int m_Size; // 通讯录中人员个数
};
void addPerson (Addressbooks *abs);
void showPerson (Addressbooks *abs);
int main () {
struct Addressbooks abs;
abs.m_Size = 0;
while (true) {
showMenu(); // 菜单调用
// cin >> select;
// 检查输入是否有效
// if (cin.fail()) {
// cin.clear(); // 清除错误状态
// cin.ignore(numeric_limits::max(),'\n'); // 清空缓冲区
// cout ::max(), '\n'); // 忽略输入流中的内容直到换行符,但因为输入内容已经被清空,这里程序会等待输入一个回车(换行符)
// }
cout > input;
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits::max(), '\n');
cout ::max(), '\n');
}
return input;
}
}
}
// 添加联系人
void addPerson (Addressbooks *abs) {
// 判断通讯录是否已满
if (abs->m_Size == MAX) {
cout > name;
abs->personArray[abs->m_Size].m_Name = name;
cout > gender;
// if (cin.fail()) {
// cin.clear();
// cin.ignore(numeric_limits::max(), '\n');
// cout personArray[abs->m_Size].m_Gender = gender;
break;
}
cout personArray[abs->m_Size].m_Age = age;
cout > phone;
abs->personArray[abs->m_Size].m_Phone = phone;
cout > address;
abs->personArray[abs->m_Size].m_Address = address;
cout personArray[abs->m_Size].m_Name m_Size++;
pause();
system("clear"); // 对于 Windows 系统,应该使用 system("cls")
}
}
void showPerson (Addressbooks *abs) {
if (abs->m_Size == 0) {
cout m_Size;i++) {
cout personArray[i].m_Name personArray[i].m_Gender personArray[i].m_Age personArray[i].m_Phone personArray[i].m_Address
然后我发现在我定义的函数 getValidInput 里面加入一个 cin.eof() 的判断就基本实现了我想要的效果,但其实我不太理解原因是什么,特别是如果我把 getValidInput 函数的这个判断给注释掉的话,那么在我输入 "2" 使用 "显示联系人" 这个功能时,需要再输入一个回车才会显示 "请按回车键继续" 的字符;而如果我仍然注释 getValidInput 中的这个判断,但取消 pause 函数定义中关于 cin.eof() 的注释(见上面的代码),那么在我输入 "1" 使用 "添加联系人" 的功能的时候,在我输入完联系人信息之后,pause() 似乎不会起作用,system("clear") 会直接清屏。。