黑馬程式員課程中關于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狀態位
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294641.html
標籤:其他
上一篇:本來學的Java、python...沒學好都轉了軟體測驗,丟人嗎!測驗如何工資過萬?
下一篇:APP測驗工具大全,建議收藏
