我要求用户输入整数,我不想执行代码,除非它是严格的整数。
int x;
if(cin >> x)
例如,如果用户在上面输入一个 double,则 if 语句将执行隐式转换为整数。相反,我根本不希望代码执行。
我怎样才能防止这种情况?
我要求用户输入整数,我不想执行代码,除非它是严格的整数。
int x;
if(cin >> x)
例如,如果用户在上面输入一个 double,则 if 语句将执行隐式转换为整数。相反,我根本不希望代码执行。
我怎样才能防止这种情况?
那里没有转换。如果用户输入分数(没有double
),则>>
提取在小数点处停止。
int main() {
int x;
std::cin >> x;
std::cout << std::cin.rdbuf();
}
input:
123.456
output:
.456
如果您想将小数点的存在标记为错误,您将不得不做一些事情来提取cin
并检测它。
使用 C++ 流的一个很好的解析策略是getline
你知道你将处理成一个istringstream
,调用它,然后在你完成时s
检查它。s.peek() == std::char_traits<char>::eof()
如果您不使用getline
提取单个数字,则peek
可以检查下一个字符是否为空格(使用std::isspace
),而无需从流中消耗该字符。
尽管有点深奥,但检查输入是否完成的最简洁的方法可能是使用std::istream::sentry
.
if ( ! ( std::cin >> x ) || std::istream::sentry( std::cin ) ) {
std::cerr << "Invalid or excessive input.\n";
}
这会占用输入末尾的空间。sentry
还提供了noskipws
避免占用空间的选项。
if ( ! ( std::cin >> x ) || std::istream::sentry( std::cin, true ) ) {
std::cerr << "Invalid or excessive input. (No space allowed at end!)\n";
}
这似乎有效。它忽略了空格,我不知道你是否可以。
string s;
cin >> s;
stringstream ss(s);
int x;
if (! (ss >> x))
{
cerr << "You didn't enter an integer." << endl;
return -1;
}
string temp;
ss >> temp;
if (! temp.empty())
{
cerr << "You didn't enter an integer." << endl;
return -1;
}