int C ++的输入验证

时间:2013-11-24 00:15:47

标签: c++ input

我基本上想验证我有一个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(),因为如果没有必要,我不想使用字符串。

3 个答案:

答案 0 :(得分:1)

如果要强制输入为整数类型,请使用整数类型作为输入。如果den1int,则不会让您在其中放置浮点值。也就是说,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;
    }
}