我试图验证输入的值是否是类型为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;
}
}
答案 0 :(得分:2)
std::type_info
的成员函数name
的返回字符串是实现定义的。它不能保证"i"
。如果要根据其他类型检查对象的类型,您应该这样做:
typeid(object) == typeid(T)
适用于任何T
类型。在您的示例中:
typeid(number) == typeid(int)
但上述比较将始终返回true
,因为number
被声明为int
。 typeid
通常有助于检查多态对象的动态类型。在你的情况下,number
根本不是多态的。因此,你不需要它。
您似乎担心的是输入的验证。为此,您应该考虑如果operator>>
的{{1}}失败,则会发生以下情况:
(直到C ++ 11)
如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit。
(自C ++ 11起)
如果提取失败,则将零写入值并设置failbit。如果提取结果的值太大或太小而不适合值,则会写入
std::cin
或std::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
来访问其流状态并返回true
或false
,具体取决于是否流成功地将流的内容读入number
。