我要求用户输入整数,我不想执行代码,除非它是严格的整数。
int x;
if(cin >> x)
例如,如果用户输入上面的double,则if语句将以隐式转换为整数执行。相反,我根本不希望代码执行。
我该如何防止这种情况?
答案 0 :(得分:9)
那里没有转换。如果用户输入分数(没有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";
}
选项以避免占用空间。
{{1}}
答案 1 :(得分:0)
这似乎有效。它忽略了空白,我不知道你是否可以。
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;
}