繁体   English   中英

防止C ++中的隐式转换

[英]Preventing implicit conversion in C++

我要求用户输入整数,我不想执行代码,除非它是严格的整数。

int x;
if(cin >> x)

例如,如果用户输入上面的double,则if语句将执行,并隐式转换为整数。 相反,我根本不希望代码执行。

我怎么能阻止这个?

那里没有转换。 如果用户输入分数(没有double ),则>>提取将在小数点处停止。

http://ideone.com/azdOrO

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM