防止C++中的隐式转换

Preventing implicit conversion in C++

本文关键字:转换 C++ 防止      更新时间:2023-10-16

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

int x;
if(cin >> x)

例如,如果用户在上面输入了一个双精度,则执行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";
}

这会消耗输入端的空间。CCD_ 12还提供CCD_ 13选项以避免占用空间。

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