我基本上想验证我有一个int而不是一个浮点数。我现在拥有的是:
int den1;
cout << "Enter denominator of first fraction" << endl;
cin >> den1;
while (den1 == 0){
cout << "Enter a non-zero denominator" << endl;
cin >> den1;
}
是否存在为den1 == int生成布尔值的“测试”?我试图避免使用getline(),因为如果没有必要,我不想使用字符串。
答案 0 :(得分:1)
如果要强制输入为整数类型,请使用整数类型作为输入。如果den1
是int
,则不会让您在其中放置浮点值。也就是说,cin >> den1
将是int
值。如果用户尝试输入3.14159
,则只会读取3(它将停止在.
处读取。请注意,缓冲区的其余部分也将包含数字,因此如果您不清除它,下一次读取整数的尝试将显示为14159
。
修改强>
如果您想“强制”用户输入有效的整数,您可以执行以下操作:
std :: string line;
int value = 0;
bool valid = false;
do
{
if (std::getline(std::cin, line))
{
if (std::string::npos == line.find('.'))
{
// no decimal point, so not floating point number
value = std::stol(line);
valid = true;
}
else
{
std::cin.clear();
}
}
} while (!valid);
与以下相比,这是一个额外的代码:
int value;
std::cin >> value;
答案 1 :(得分:0)
您想使用类似
的内容if (std::cin >> den) {
// process den
}
else {
// deal with invalid input
}
当输入操作失败时,它会在流上设置std::ios_base::failbit
,并且流会转换为false
而不是true
。当流处于此故障模式时,它将不会从流中读取任何内容,即要清除的故障模式,例如,使用
std::cin.clear();
清除故障模式后,违规字符仍然位于流中。您可以使用例如
忽略下一个字符std::cin.ignore();
或忽略所有字符,直到下一个换行符:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
答案 2 :(得分:0)
首先,用户输入始终是一个字符串。接下来,您需要更精确地定义目标。例如,要区分的一个合理的事情是输入是可以整体解析为整数,还是作为浮点数解析,或者两者都不解析。这是使用iostream进行此操作的一种方法,无视空白:
#include <iostream>
#include <sstream>
#include <string>
for (std::string line; std::getline(std::cin, line); )
{
std::istringstream iss1(line), iss2(line);
int n;
double x;
if (iss1 >> n >> std::ws && iss1.get() == EOF)
{
// have an int, use "n"
}
else if (iss2 >> d >> std::ws && iss2.get() == EOF)
{
// have a floating point number, use "d"
}
else
{
// failed to parse the input
continue;
}
}