[英]c++ Cout keeps repeating while inputting
我相信我的代碼是正確的,但是在輸入持卡人姓名之后,我要輸入的整個內容會不斷重復。
Print Cards by selecting the type (0 when done):
1. Basic Card
2. ID Card
3. Bank Card
Card Type: 2
Institution name: a
Cardholder name: lola
Expiration date mmddyyyy (0 if none):
Institution name: Cardholder name: Expiration date mmddyyyy (0 if none):
Institution name: Cardholder name: Expiration date mmddyyyy (0 if none):
Institution name: Cardholder name: Expiration date mmddyyyy (0 if none):
Institution name: Cardholder name: Expiration date mmddyyyy (0 if none):
Institution name: Cardholder name: Expiration date mmddyyyy (0 if none):
為了避免這種情況我該怎么辦? 是我放在for循環中的參數嗎?
#include <iostream>
#include <vector>
int main ()
{
std::vector <Card*> cardbook;
int card_type;
std::string institute_name;
std::string card_name;
int expire_date;
int identify_num;
int birthdate;
int account_num;
int secure_code;
std::cout << "Print Cards by selecting the type (0 when done): " << std::endl
<< " 1. Basic Card " << std::endl
<< " 2. ID Card " << std::endl
<< " 3. Bank Card " << std::endl;
std::cout << "Card Type: " ;
std::cin >> card_type;
while (card_type)
{
if (card_type == 1)
{
std::cout << "Institution name: ";
getline (std::cin, institute_name);
std::cin.ignore();
std::cout << "Cardholder name: ";
getline (std::cin, card_name);
std::cin.ignore();
std::cout << "Expiration date mmddyyyy (0 if none): ";
std::cin >> expire_date;
std::cout << std::endl <<std::endl;
cardbook.push_back (new Card(institute_name, card_name, expire_date));
}
else if (card_type == 2)
{
std::cout << "Institution name: ";
getline (std::cin, institute_name);
std::cin.ignore();
std::cout << "Cardholder name: ";
getline (std::cin, card_name);
std::cin.ignore();
std::cout << "Expiration date mmddyyyy (0 if none): ";
std::cin >> expire_date;
std::cout << "ID number: ";
std::cin >> identify_num;
std::cout << "DOB mmddyyyy (0 if not listed)";
std::cin >> birthdate;
std::cout << std::endl << std::endl;
cardbook.push_back (new IDCard(institute_name, card_name, expire_date, identify_num, birthdate));
}
else if (card_type == 3)
{
std::cout << "Institution name: ";
getline (std::cin, institute_name);
std::cin.ignore();
std::cout << "Cardholder name: ";
getline (std::cin, card_name);
std::cin.ignore();
std::cout << "Expiration date mmddyyyy (0 if none): ";
std::cin >> expire_date;
std::cout << "Account number: ";
std::cin >> account_num;
std::cout << "Card Security Code: ";
std::cin >> secure_code;
std::cout << std::endl << std::endl;
cardbook.push_back (new BankCard (institute_name, card_name, expire_date, account_num, secure_code));
}
else
{
break;
}
}
for(auto& v : cardbook)
{
v->print();
}
for (int i = 0; i < cardbook.size(); i++)
{
delete cardbook[i];
}
return 0;
}
注意:字符串庫包含在頭文件中。 還有另一個問題,如果我想按到期日期的順序輸入卡,排序功能是正確使用的功能嗎? 還是我會使用for循環? 提前致謝!
問題是您對變量card_type的輸入只能使用一次, 而while(card_type)的輸入只能永遠使用,因為它始終為非零。 我猜您需要將輸入部分放入循環中。
實際上,我的建議是,如果您是編程的初學者,請使用IDE或某種調試器。 同樣,良好的習慣是縮進並避免重復代碼。
由於card_type
的輸入為2,並且此后永遠不會修改該值,因此while循環將永遠繼續。
這是因為任何非零整數都將計算為true
。 例如,編譯並執行以下代碼:
int main(){
int t = 134;
while(t){
cout << "t is true !" << endl;
}
}
將繼續打印t is true !
直到您手動停止執行為止。 當然,這可以與if
, while
...一起if
。這意味着可以將整數轉換為布爾值。 反之亦然。 可以將false
強制轉換為int
並將值設為0,將true
值設為1。
長話短說:基本上任何期望布爾值作為參數的東西都可以將整數解釋為布爾值,將0評估為false
,將所有其他整數評估為true
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.