這是我為簡單評分考試撰寫的代碼(我仍然是一個初學者)但是當我在(Grades)中輸入錯誤時,它不會轉到我創建的名為(FalseInput)的函式以使用戶能夠重新-進入(Grades)有什么建議如何解決?以及一般如何改進?這是問題所在的示例:
請輸入您的姓名:rafeeq
請插入成績:作為 (這是一個輸入錯誤)
你失敗了
謝謝。
#include <iostream>
#include <string>
using namespace std;
char Name[30];
int Grades;
const int MinGrade(50);
void FalseInput() {
cout << "pleae enter the number again : ";
cin >> Grades;
if (Grades >= MinGrade) {
cout << Name << " : " << "you passed\n";
cout << Grades;
} else if (Grades < MinGrade and cin.fail() == 0) {
cout << "you failed\n";
} else if (cin.fail() == 1) {
cout << "its not a valid number\n";
cin.clear();
cin.ignore(1000, '\n');
cout << endl;
FalseInput();
}
}
int main() {
cout << "Please Type Your Name : ";
cin.getline(Name, 30);
cout << "Please Insert The Grade : ";
cin >> Grades;
if (Grades >= MinGrade) {
cout << Name << " : " << "you passed\n";
cout << "The Grade Achieved : " << Grades << "%";
} else if (Grades < MinGrade) {
cout << "you failed\n";
} else if (cin.fail() == 1) {
cout << "its not a valid number\n";
cin.clear();
cin.ignore(1000, '\n');
cout << endl;
FalseInput();
}
return 0;
}
uj5u.com熱心網友回復:
發生了什么:當字串 "as" 試圖寫入整數 Grades 時,cin.fail() 被設定,并且 Grades 的默認值為 0(我認為這是正確的) C cin 將字串讀入 int 型別回傳0
All-in-All:在檢查其值之前需要輸入驗證。
這是一種方法,檢查cin是否能夠成功轉換:https : //www.hackerearth.com/practice/notes/validating-user-input-in-c/
另一種方法是將cin讀入字串而不是int,然后您可以控制如何將其轉換/強制轉換為您想要的任何形式(更多作業,但因為您是新手-您將學到很多東西)。
次要注意事項:您的 50 個字符的名稱字串 - 想象一下如果您輸入 60 個字符會發生什么。將有比容器可以容納的更多資料,因此寫入越過邊界并寫入他的鄰居(可能導致段錯誤,或者更糟 - 瘋狂的意外行為) 為什么這有效?使用cin讀取小于給定輸入的char陣列
uj5u.com熱心網友回復:
您不會int在此處檢查提取是否成功:
cin >> Grades;
您可以像這樣在提取后檢查輸入流的狀態,它需要是第一個條件,否則程式將與MinGradefirst進行比較并獲得trueon Grades < MinGrade。
if(!(cin >> Grades)) {
if(cin.eof()) {
// You can't recover the input steam from eof so here you need
// to handle that. Perhaps by terminating the program.
}
cin.clear();
cin.ignore(1000, '\n');
cout << endl;
FalseInput();
} else if(Grades >= MinGrade) {
cout << Name << " : " << "you passed\n";
cout << "The Grade Achieved : " << Grades << "%";
} else if(Grades < MinGrade) {
cout << "you failed\n";
}
您確實有很多不必要的代碼重復,并且您還使用了一個陣列char來讀取名稱 - 但您已經包含了,<string>所以我假設您熟悉std::string. 我建議使用那個。
簡化:
#include <iostream>
#include <limits>
#include <string>
int main() {
const int MinGrade = 50;
std::string Name;
int Grades;
std::cout << "Please Type Your Name : ";
if(std::getline(std::cin, Name)) {
while(true) {
std::cout << "Please Insert The Grade : ";
if(!(std::cin >> Grades)) {
if(std::cin.eof()) {
std::cout << "Bye bye\n";
break;
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "That's not a valid number!\nPlease enter the "
"number again!\n";
} else if(Grades >= MinGrade) {
std::cout << Name << " : " << "you passed\n";
std::cout << "The Grade Achieved : " << Grades << "%\n";
break;
} else { // no need to check "Grades < MinGrade" here
std::cout << "you failed\n";
break;
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321237.html
標籤:C
上一篇:C 和讀取大型txt檔案
