验证整数输入C ++?

时间:2012-11-13 22:42:58

标签: c++ validation input types

我使用!(cin >> input)来验证整数输入,但它不会捕获其他数据类型,例如浮点数。相反,它需要第一个整数。 EG:

  

请输入一个数字:2.5。

我的错误信息出现在这里,它假设循环,但它取代第一个数字。

输出“2”

如何让它忽略小数输入?

3 个答案:

答案 0 :(得分:1)

输入流将任何以符号开头,后跟至少一个十进制数的内容视为有效的整数输入。如果要在包含小数点的十进制输入上失败,则需要执行不同的操作。解决这个问题的一种方法是读取整数并查看成功读取整数后的字符是否为小数点:

if (!(std::cin >> value)
    || std::cin.peek() == std::char_traits<char>::to_int_type('.')) {
    deal_with_invalid_input(std::cin);
}

正如Thomas Matthews正确指出的那样,问题并不仅限于浮点数,而是任何前缀为数字后跟非空格的东西(而不是EOF:上述解决方案实际上会错过一个有效的整数文件的结尾,即没有任何内容,甚至不是换行符。要仅读取整数后跟空格或文件末尾,这样的内容将按顺序排列:

if (!(std:cin >> value)
    || (!std::isspace(std::cin.peek())
        && std::cin.peek() != std::char_traits<char>::eof())) {
    deal_with_invalid_input(std::cin);
}

没有任何方法可以返回已读取的字符。由于在许多地方使用它并不是很好用,因此将此函数打包到合适的std::num_get<char>方面和imbue()具有相应std::locale的流可能是合理的。虽然处理代码的表达式实际上更简单,但这有点高级。

答案 1 :(得分:0)

在验证之前,您需要阅读完整输入。您可以使用cin.getline()getline()来执行此操作,然后检查输入是否符合您的要求。

答案 2 :(得分:0)

您正尝试使用cin读取不同类型的值。

istream重载>>运算符以匹配您期望输入的数据类型,cinistream类的实例。

当期望的类型是整数时,它将消耗字符直到可以转换为整数的字符串,并将剩余的字符留在流中以供稍后解析。浮点值或其他简单类型也会发生同样的情况。 有关运算符及其支持的类型的详细信息,请参阅this reference page。 最重要的是,如果你想要一个整数值,但是期望输入的浮点值,你必须使用你想要从输入中解析的正确类型的值(这里是float),并在稍后进行任何所需的转换(这里使用truncfloorceil或符合您需求的舍入函数。

这是一个简单的例子:

#include <iostream>
#include <string>

using namespace std;

int main() {

    float f;
    string str;

    cout << "please enter a float :";
    cin >> f;

    cout << "value entered : " << f << endl;

    cout << "stream error : " 
         << (cin.fail() ? "yes" : "no") 
         << endl;

    cin >> str;

    cout << "remaining data : " << str << endl;

}

这个非常简单的程序演示了在istream上使用>>运算符,特别是预期的浮点值。对于以下输入:“1.2345Z6789”(注意数字中间的 Z ),程序将解析值“1.2345”并在输入缓冲区中保留“Z6789”,可用于随后的阅读。

如果您将f的类型从float替换为int,则相同输入的程序将读取值“1”,并保留“.2345Z6789”在输入缓冲区中。

注意:在您的代码中,您使用!运算符来测试流的状态,这相当于我在我的示例中使用的fail方法。