📜  检查 cin 是否没有得到 int - C++ (1)

📅  最后修改于: 2023-12-03 15:40:30.457000             🧑  作者: Mango

检查 cin 是否没有得到 int - C++

有时候在进行输入操作时,cin 可能无法正确地获取需要的数据类型,并导致程序出错。这种错误通常是由于输入流中包含了无法转换为目标数据类型的字符或格式不正确的数据引起的。

为了防止这种情况的发生,我们可以进行以下检查以确保 cin 正确地读取了数据:

1. 检查 cin 是否成功读取了数据

每次调用cin时,我们都应该检查其是否成功读取了数据。可以通过cin的返回值来实现这一点。如果成功读取数据,则返回 true,否则返回 false。

下面是一个示例代码段,它演示了如何检查 cin 是否成功读取了数据,并处理不正确的输入:

int num;
while (!(cin >> num)) {
    cin.clear(); // 清除 cin 的错误标志
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); //将缓存中的错误数据清除掉
    cout << "请输入一个整数: ";
}
cout << "您输入的数字为: " << num << endl;

在上面的代码中,while 循环将持续运行直到成功读取了一个整数。如果读取失败,则使用 cin.clear() 清除 cin 的错误标志,并使用 cin.ignore() 将缓存中的错误数据清除掉。然后,通过提示用户重新输入数据,等待正确的数据。

2. 避免读取错误字符

我们可以使用 cin.get() 函数来读取字符,然后判断该字符是否是我们期望的数据类型。如果不是,则忽略该字符并提示用户重新输入。以下是一个示例代码段:

int num;
while (true) {
    cout << "请输入一个整数: ";
    cin >> num;
    if (cin.fail()) {
        cin.clear(); // 清除 cin 的错误标志
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); //将缓存中的错误数据清除掉
        cout << "输入有误,请重新输入" << endl;
    } else {
        break;
    }
}
cout << "您输入的数字为: " << num << endl;

在上面的代码中,我们使用 cin.fail() 来检测读取是否失败。如果失败,则使用与之前相同的方法忽略错误并提示用户重新输入。

3. 检查输入流是否为空

如果我们使用 cin 读取多个数据,我们需要在读取每个数据之前检查输入流的状态。一种方法是使用 cin.eof() 检查输入流是否为空。以下是一个示例代码段:

int num1, num2;
while (true) {
    cout << "请输入两个整数: ";
    cin >> num1 >> num2;
    if (cin.eof()) { // 判断是否到达 EOF
        break;
    }
    if (cin.fail()) {
        cin.clear(); // 清除 cin 的错误标志
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); //将缓存中的错误数据清除掉
        cout << "输入有误,请重新输入" << endl;
    } else {
        cout << "您输入的两个数字分别为: " << num1 << " " << num2 << endl;
    }
}
cout << "输入流已空,程序结束" << endl;

在上面的代码中,我们首先通过 cin.eof() 函数检查输入流是否为空。然后,如果读取失败,则使用与之前相同的方法清除缓存并提示用户重新输入。否则,我们打印出读取的两个数字,并继续读取输入流中的数据。

总结

在读取输入数据时,检查 cin 是否正确地读取了数据是一个很好的习惯。通过以上方法,我们可以很容易地避免由于输入数据格式不正确而导致的程序错误。