📜  如何确保用户输入一个 int 而不是其他任何 c++ (1)

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

如何确保用户输入一个 int 而不是其他任何 c++

在 C++ 中,控制用户输入数据类型是非常重要的。如果不进行检查或类型转换,那么用户可能会输错或意外输入其他数据类型,这可能导致程序崩溃。

一、使用 cin 来读取输入

在 C++ 中,我们通常使用 cin 来读取用户的输入。如果我们只需要一个 int,那么我们可以使用以下代码:

int input;
cin >> input;

这看起来非常简单,但是它并不能确保用户输入一个 int 而不是其他任何类型。如果用户输入了一个字符或字符串,那么程序将继续运行,但是变量 input 中存储的将不是一个 int 类型。

二、使用 cin.fail() 来检查输入

为了确保用户输入一个 int,在读取用户输入之后,我们应该检查输入是否成功,并且输入的数据类型是否正确。可以使用 cin.fail() 函数来检查输入是否失败。如果是的话,则需要清空输入缓冲区。

int input;
cin >> input;
if (cin.fail()) {
    cin.clear(); //恢复 cin 的状态
    cin.ignore(1024, '\n'); //清空输入缓冲区
    cout << "请输入一个整数" << endl;
}

这里的 cin.clear() 将清除 cin 条件状态标志。如果您在代码中没有调用 cin.print(),则可能无法进行下一次读取。因此,我们应该清除标志,以便下次能够正常读取。

接下来,cin.ignore() 将忽略输入缓冲区中的字符,直到遇到换行符 \n。

三、使用 cin.good() 来检查输入缓冲区

使用 cin.fail() 可能会有一个问题:如果用户在输入非 int 类型的数据后,输入了一个小数,那么 cin.fail() 将失败,我们将清除输入缓冲区并重试。但是,这将导致我们没有机会纠正错误。解决这个问题的方法是使用 cin.good() 来检查输入缓冲区是否为空。

int input;
cin >> input;
if (cin.fail() || cin.get() != '\n') {
    cin.clear(); //恢复 cin 的状态
    cin.ignore(1024, '\n'); //清空输入缓冲区
    cout << "请输入一个整数" << endl;
}

这里的 cin.get() 读取输入缓冲区中的一个字符。如果读取到换行符,则说明输入完整,cin.good() 将返回 true,否则将返回 false。

四、使用 boost::lexical_cast 进行类型转换

如果您正在开发使用 Boost C++ 库的项目,那么可以考虑使用 boost::lexical_cast 进行类型转换。boost::lexical_cast 可以将任何基本类型转换为一个字符串,并将该字符串转换回所需类型。

#include <boost/lexical_cast.hpp>

try {
    int input = boost::lexical_cast<int>("123");
} catch (const boost::bad_lexical_cast& e) {
    cout << e.what() << endl;
}

这里的 try/catch 块将捕获 boost::bad_lexical_cast 异常,该异常将在转换失败时抛出。如果转换成功,则 input 变量将存储转换后的整数值。

五、总结

以上是在 C++ 中控制用户输入 int 类型的几个方法。在实际编程中,使用这些技术可以确保用户输入正确的数据类型,并使程序更加健壮。