防止C ++中的隐式转换

时间:2013-08-27 01:58:41

标签: c++

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

int x;
if(cin >> x)

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

我该如何防止这种情况?

2 个答案:

答案 0 :(得分:9)

那里没有转换。如果用户输入分数(没有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"; } 选项以避免占用空间。

{{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;
}