验证变量类型

时间:2014-04-10 22:31:52

标签: c++ typeid

我试图验证输入的值是否是类型为id函数的整数。我知道返回的值将是i而不是整数。我不知道为什么输入的值返回false并且程序停止。任何帮助将不胜感激 该程序在没有while语句的情况下正常工作

#include <iostream>
#include <typeinfo>
using namespace std;

int main() {
    int number, factorial;
    cout << "Enter a number: ";
    cin >> number;
    factorial = 1;
    while (typeid(number).name() == "i") {
        for (int i = number; i >= 1; --i){
            factorial *= i;
        }
        cout << factorial;
    }
}

2 个答案:

答案 0 :(得分:2)

std::type_info的成员函数name的返回字符串是实现定义的。它不能保证"i"。如果要根据其他类型检查对象的类型,您应该这样做:

typeid(object) == typeid(T)

适用于任何T类型。在您的示例中:

typeid(number) == typeid(int)

但上述比较将始终返回true,因为number被声明为inttypeid通常有助于检查多态对象的动态类型。在你的情况下,number根本不是多态的。因此,你不需要它。

您似乎担心的是输入的验证。为此,您应该考虑如果operator>>的{​​{1}}失败,则会发生以下情况:

  • (直到C ++ 11)

      

    如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit。

  • (自C ++ 11起)

      

    如果提取失败,则将零写入值并设置failbit。如果提取结果的值太大或太小而不适合值,则会写入std::cinstd::numeric_limits<T>::max()并设置failbit标志。

因此,您需要做的就是在需要之后立即检查失败位:

std::numeric_limits<T>::min()

答案 1 :(得分:1)

当流读取到对象时,它们会检查正在读取的格式并将该格式解析为对象。如果流无法正确解析该数据,则会在其错误掩码中设置错误。错误掩码用于确定I / O操作是成功还是失败。当流被放入布尔上下文(如if()while()循环的参数)时,如果其错误掩码没有任何错误,它将返回true。

如果您的目的是仅使用整数,那么我建议您采用使用流本身的模式来检查I / O操作是否成功。例如,这就是它在代码中的外观:

if (std::cin >> number) {
    ...
}

格式化的提取器operator>>()返回对流的引用,然后将调用其成员函数explicit operator bool() const来访问其流状态并返回truefalse,具体取决于是否流成功地将流的内容读入number