提问人:Steve lel 提问时间:5/4/2023 更新时间:5/4/2023 访问量:36
如何在函数中创建一个循环来获取一个既是数字又在特定范围内的 cin 以返回值?
How do I create a loop in a function to get a cin that is both a number and in a certain range, to return the value?
问:
嗨,我需要在一个需要显示菜单的类中创建一个 int 成员函数,然后提示用户输入一个既是数字又介于 1-5 之间的 cin 输入。它需要循环 cin,直到给出正确的值,根据问题显示不同的错误消息:然后它需要能够返回该值。
这是我的 c++ 代码
int ClassName::menu() {
cout << "Menu title" << endl;
cout << "1- option1" << endl;
cout << "2- op 2" << endl;
cout << "3- op 3" << endl;
cout << "4- op 4" << endl;
cout << "5- op 5" << endl;
cout << "0- exit program" << endl;
cout << "> ";
int flag = 1;
int value;
string input;
while (flag == 1) {
getline(cin, input);
value = stoi(input);
if (input[0] < '0' || input[0] > '5') {
cout << "Invalid Integer, try again: ";
input.clear();
}
else if (value < 0 || value > 5) {
cout << "[0<=value<=5], retry: ";
input.clear();
}
else {
flag = 0;
}
}
return value;
}
答:
0赞
Remy Lebeau
5/4/2023
#1
stoi()
如果转换失败,则引发异常,但您没有捕获异常。
成功将输入字符串转换为整数后,无需查看输入的单个字符,特别是因为您甚至没有查看整个输入。
但实际上,为什么要首先将输入读取到字符串中,然后将其转换为整数?您应该改用直接将输入读入整数。operator>>
此外,您没有正确使用。它不会从输入缓冲区中删除数据。它会重置流的错误状态,但您在流未处于错误状态的位置调用它。cin.clear()
请尝试以下操作:
int ClassName::menu() {
cout << "Menu title" << endl;
cout << "1- option1" << endl;
cout << "2- op 2" << endl;
cout << "3- op 3" << endl;
cout << "4- op 4" << endl;
cout << "5- op 5" << endl;
cout << "0- exit program" << endl;
cout << "> ";
int value;
do {
if (cin >> value) {
if (value >= 0 && value <= 5) {
break;
}
cout << "Invalid choice, retry: ";
}
else {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cout << "Invalid input, retry: ";
}
}
while (true);
return value;
}
评论
std::stoi
input
try
std::stoi
stoi