验证和转换浮动

时间:2014-01-03 20:33:35

标签: c++ string validation floating-point

我正在编写一个程序,我必须验证用户输入的值是否为有效的浮点数。所以,我尝试过这种方法:

string test;
cin >> test;
float n;
n = atof(test.c_str());
cout << n << endl;

但它似乎没有完成这项工作;转换时,.之后的数字会丢失。如何验证在C ++(而不是11)中使用了有效的浮点数?

示例:

INPUT: 32.e
OUTPUT: 32 (should be error)

INPUT: 2a.1234
OUTPUT: 2 (should be error)

3 个答案:

答案 0 :(得分:3)

当您使用格式化读取并结合检查是否所有内容都被读取时,您可以确定[complete]值是否是有效的浮点数,例如:

int main()
{
    for (std::string test; std::cin >> test; ) {
        std::istringstream in(test);
        double value;
        if (in >> value >> std::ws && in.eof()) {
            std::cout << "the string '" << test << "' is a valid floating point number\n";
        }
        else {
            std::cout << "the string '" << test << "' is not a valid floating point number\n";
        }
    }
}

测试确实忽略了字符串周围的空白。如果不希望这样,可以使用操纵器std::noskipws,并且可以省略std::ws的使用。或者,您可以使用strtod()确定整个值是否表示浮点数。

atof()只是查看其参数的初始字符串是否为有效的浮点数,这是您引用的示例的情况。

答案 1 :(得分:1)

int main() {
    float f;
    cin >> f;
    if (!cin.fail()) {
        cout << f << endl;
    } else {
        cout << "Invalid input" << endl;
    }
    // your code goes here
    return 0;
}

fail()函数检查流上的failbitbadbit。如果I / O操作存在逻辑错误(例如:尝试读取浮点数,但无法将令牌解析为浮点数),则failbit表示您想要的信号,并且badbit信号是否存在是I / O操作的读/写错误(根本无法读/写令牌)。

答案 2 :(得分:0)

答案实际上取决于您是否需要验证整行输入。即使只有输入的开头是浮点数(例如3.3a,4.72abc),atof也会工作。如果您希望验证所有输入流,那么您将必须使用getline读取字符串并解析它。只需检查是否存在数字加上一个'。'。

我认为C ++ faq lite的基本理念。 http://www.parashift.com/c++-faq/istream-and-ignore.html

我的例子是循环的,这样你就可以更容易地看到我的意思了。

#include <iostream>
#include <limits>

int main()
{
    while(true)
    {
      double value = 0;

      while ((std::cout << "Enter a floating point number\n ")
             && !(std::cin >> value)) {
        std::cout << "\nThat's not a floating point number\n ";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
      }

      std::cout << "You entered " << value << "\n";
    }
    return 0;
}