在c ++中验证float

时间:2012-03-01 18:28:37

标签: c++ floating-point infinite-loop

我正在以浮动方式获取输入。例如,如果用户输入3.5,那么它可以正常工作。如果用户输入3.X或任何其他字符,则会导致无限循环。有什么方法可以验证变量,以便用户只能输入数字?我正在使用gcc编译器。

5 个答案:

答案 0 :(得分:2)

通常的方法是将数据作为字符串读取,然后将其转换为float,并查看在该转换中消耗的整个输入字符串。提升lexical_cast(例如)可以为您自动完成大部分操作。

答案 1 :(得分:1)

你没有提供任何示例代码,所以我们可以看到你在做什么,但我 怀疑你正在做的事情:

while ( ! input.eof() ) {
    double d;
    input >> d;
    //  do someting with d...
}

这有两个问题:第一个是一旦发生错误 (因为'X'不能成为double的一部分),因此流会记住。{ 错误,直到它被明确清除,因此所有后续输入也会失败 (并且不会从字符串中提取更多字符)。当你 在流中有格式错误,有必要重置错误 继续之前的状态。

上述第二个问题是input.eof()并不意味着 直到输入失败之后;它不是一个非常有用的功能。 你可能想做的是:

double d;
while ( input >> d ) {
    //  do something with d
}

这将停止读取第一个错误。如果你想恢复 错误并继续,那么你需要更精细的东西:

double d;
while ( input >> d || !input.eof() ) {
    if ( input ) {
        //  do something with d...
    } else {
        //  format error...
        input.clear();      //  reset the error state...
        //  advance the stream beyond the error:
        //  read to next white space (or EOF), or at least
        //  advance one character.
    }
}

或者,它通常比其他人建议的更强大, 逐行读取输入,然后扫描行:

std::string line;
while ( std::getline( input, line ) ) {
    std::istringstream l( line );
    double d;
    if ( l >> d >> std::ws && d.get() == EOF ) {
        //  do something with d...
    } else {
        //  format error...
        //  we don't have to clear or skip ahead, because we're
        //  going to throw out the istringstream anyway, and the
        //  error didn't occur in the input stream.
    }
}

这强加了一种更严格的格式:每行一个值,但是如果 你计算行数,你可以在错误中输出行号 信息;必须纠正错误输入的人会欣赏 这一点。

答案 2 :(得分:0)

try 
{
  double x = boost::lexical_cast<double>(str); // double could be anything with >> operator.
}
catch(...) { oops, not a number }

来自:How to determine if a string is a number with C++?

答案 3 :(得分:0)

从输入中读取double值并确保其形成良好的最佳方法是将输入作为字符串读取,然后使用stdlib库中包含的标准strtod函数对其进行解析。 / p>

有关解析该字符串时某些不同可能性的更详细说明,您可以查看this其他帖子。

答案 4 :(得分:0)

你的帖子我有些不清楚,但据我所知,我认为你应该使用strtof。 从用户那里获取数据作为String,而不是使用函数转换为float并通过比较指针检查是否成功。

有关详细信息,请查看strtof的手册页。