[英]C++ cin.fail() while loop
我正在嘗試制作一個程序,當用戶輸入一些愚蠢的東西時,該程序不接受代碼錯誤。 例如為整數輸入字符串,我現在不知道該怎么辦。 我正在寫下隨機的內容,因為它說我沒有足夠的細節,即使我現在寫了整個段落。
void scoretoletter::letter() {
int a = 0;
int question;
while (a == 0) {
cout << "1.Rectangle" << endl;
cout << "2.Triangle" << endl;
cout << "3.Circle" << endl;
cout << "4.Exit" << endl;
float area;
float Width;
float Length;
float Height;
float base;
float radius;
int l;
cin >> question;
if (question == 1) {
cout << "Whats your length?" << endl;
cin >> Length;
if (cin.fail()) {
cout << "That is not valid try again" << endl;
}
else {
cout << "Whats your width?" << endl;
cin >> Width;
if (cin.fail()) {
cout << "That is not valid try again" << endl;
}
else {
if (Length == 0 || Width == 0 ) {
cout << "That is not valid try again." << endl;
system("pause");
}
else {
area = Length * Width;
cout << "The area is: " << area << endl;
}
}
}
}
else if (question == 2) {
cout << "What is the Base?" << endl;
cin >> base;
if (cin.fail()) {
cout << "That is not valid try again." << endl;
}
else {
cout << "What is the Height?" << endl;
cin >> Height;
if (cin.fail()) {
cout << "That is not valid try again." << endl;
}
else {
if (base == 0 || Height == 0 || cin.fail()) {
cout << "That is not valid try again." << endl;
system("pause");
}
else {
area = base * Height * .5;
cout << "The area is: " << area << endl;
}
}
}
}
else if (question == 3) {
cout << "What is the radius?" << endl;
cin >> radius;
if (radius == 0 || cin.fail()) {
cout << "That is not valid try again." << endl;
system("pause");
}
else {
area = radius * radius * 3.14;
cout << "The area is: " << area << endl;
}
}
else if (question == 4) {
a = 1;
}
else {
cout << "That is not valid try again." << endl;
}
system("pause");
}
}
而不是使用這種深層嵌套的丑陋if-else語法,您可以使用return
指令編寫這樣簡單得多的代碼。 為了避免重復,您還可以返回狀態並循環,直到成功為止。
enum result_status
{
RESULT_STATUS_OK,
RESULT_STATUS_INVALID,
RESULT_STATUS_DONE
}
void scoretoletter::askQuestions() {
while(true)
switch(letter())
{
RESULT_STATUS_OK:
system("pause");
continue;
RESULT_STATUS_INVALID:
cout << "That is not valid try again." << endl;
system("pause");
cin.clear();
continue;
RESULT_STATUS_DONE:
system("pause");
return;
}
}
enum result_status scoretoletter::letter() {
int question;
cout << "1.Rectangle" << endl;
cout << "2.Triangle" << endl;
cout << "3.Circle" << endl;
cout << "4.Exit" << endl;
float area;
float Width;
float Length;
float Height;
float base;
float radius;
int l;
cin >> question;
if (question == 1) {
cout << "Whats your length?" << endl;
cin >> Length;
if (cin.fail())
return RESULT_STATUS_INVALID;
cout << "Whats your width?" << endl;
cin >> Width;
if (cin.fail() || Length == 0 || Width == 0)
return RESULT_STATUS_INVALID;
area = Length * Width;
cout << "The area is: " << area << endl;
return RESULT_STATUS_OK;
}
if (question == 2) {
cout << "What is the Base?" << endl;
cin >> base;
if (cin.fail())
return RESULT_STATUS_INVALID;
cout << "What is the Height?" << endl;
cin >> Height;
if (cin.fail())
return RESULT_STATUS_INVALID;
if (base == 0 || Height == 0 || cin.fail()) {
return RESULT_STATUS_INVALID;
area = base * Height * .5;
cout << "The area is: " << area << endl;
return RESULT_STATUS_OK;
}
if (question == 3) {
cout << "What is the radius?" << endl;
cin >> radius;
if (radius == 0 || cin.fail()) {
return RESULT_STATUS_INVALID;
area = radius * radius * 3.14;
cout << "The area is: " << area << endl;
return RESULT_STATUS_OK;
}
if (question == 4)
return RESULT_STATUS_DONE;
return RESULT_STATUS_INVALID;
}
注意使用system("pause");
這也是一個壞主意,您確實應該編寫自己的Press any key to continue
在程序中起作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.