我有3 cin for int。
int input1;
cin >> input;
int input2;
cin >> input2;
int input3
cin >> input3;
问题是如果我在控制台中键入2 3 4
,它将一次性输入所有3个。我该如何防止这种情况?如果他们这样做,可能会给他们一个警告。基本上是错误输入验证。
答案 0 :(得分:0)
一种可能的解决方案:
int strict_stoi(const string& s)
{
size_t end_pos;
int num = stoi(s, &end_pos);
for (size_t i=end_pos; i<s.length(); ++i)
{
if (!isspace(s[i]))
throw invalid_argument("You have entered some garbage after the number!");
}
return num;
}
int read_number()
{
string s;
getline(cin, s);
return strict_stoi(s);
}
int read_number_with_retry(const char* prompt)
{
for (;;)
{
try
{
cout << prompt;
return read_number();
}
catch (invalid_argument& ex)
{
cout << ex.what() << endl;
}
}
}
int test()
{
int input1 = read_number_with_retry("Enter input #1: ");
int input2 = read_number_with_retry("Enter input #2: ");
int input3 = read_number_with_retry("Enter input #3: ");
return 0;
}
如果你输入一个完全无效的参数(例如“a”),那么它会显示一个不太用户友好的“无效stoi参数”消息,但是如果你输入“5 6”那么它会显示“你输入了一些垃圾”号码之后!“如果你想用一些用户友好的东西替换“无效的stoi参数”消息,那么当你发现“数字后面的垃圾”时你应该抛出一个invalid_argument
异常,你应该抛出你自己的garbage_after_the_number
异常并在此你可以区分两个不同的错误:只有在输入无效的情况下才会抛出invalid_argument
(如“a”),只有在出现其他类型的错误时才会抛出garbage_after_the_number
你可以捕获两个不同的例外,你可以在这两种情况下打印完全自定义的消息。我将此实施作为额外的练习留给您。
答案 1 :(得分:0)
您可以这样做:
#include <iostream>
#include <sstream>
int main() {
while(true) {
std::cout << "Enter a number [Enter to quit]: ";
std::string line;
getline(std::cin, line);
if(line.empty()) break;
else {
std::stringstream input(line);
int number;
// Preceding white space number trailing white space:
input >> number >> std::ws;
if(input && input.eof()) {
std::cout
<< "The number surronded by possible white space is: "
<< number
<< '\n';
}
else {
std::cout
<< "The input line is invalid: "
<< line
<< '\n';
}
}
}
}
如果你想严格要求:
#include <iostream>
#include <iomanip>
#include <sstream>
...
// Number without preceding and trailing white space:
input >> std::noskipws >> number;
...