[英]Preventing implicit conversion in C++
我要求用户输入整数,我不想执行代码,除非它是严格的整数。
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.