4

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

int x;
if(cin >> x)

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

我怎样才能防止这种情况?

4

2 回答 2

10

那里没有转换。如果用户输入分数(没有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";
}
于 2013-08-27T02:20:47.450 回答
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;
}
于 2013-08-27T02:29:21.973 回答