C++ atof.如何检查输入错误?

c++ atof. How to check wrong input?

所以我使用 atof 将我的字符串转换为双精度。但我需要知道我是否输入错误(如 y564 等)。我怎样才能检查它?我需要正确的号码才能对其进行进一步操作。

double x = atof(s.c_str());

使用std::stod。它在无效输入时抛出异常。或者,如果您坚持使用 C 解决方案,请使用 strtod;它为您提供有关结果的更多信息。

您可以简单地检查字符串中的每个字符是否为“.”。或 std::isdigit(int ch) 在将其传递给 atof 之前(并且“.”必须是唯一的)

更紧凑的解决方案是使用像 ^[0-9]+(\.[0-9]+)?$ 这样的正则表达式来处理字符串,它应该适用于通用浮点值。

您可能想使用 std::stod:

[live]

bool parse_double(std::string in, double& res) {
    try {
        size_t read= 0;
        res = std::stod(in, &read);
        if (in.size() != read)
            return false;
    } catch (std::invalid_argument) {
        return false;
    }    
    return true;
}

int main()
{
    double d;
    bool b = parse_double("123z", d);
    if (b)
      std::cout << d;
    else
      std::cout << "Wrong input";
}

[编辑]

您可能会发现 here:

Return value

double value corresponding to the contents of str on success. If the converted value falls out of range of the return type, the return value is undefined. If no conversion can be performed, 0.0 is returned.

因此无法确定输入是否错误或包含 0

atof(http://en.cppreference.com/w/cpp/string/byte/atof) 的定义:

Return value

double value corresponding to the contents of str on success. If the converted value falls out of range of the return type, the return value is undefined. If no conversion can be performed, 0.0 is returned.

如果您使用现代 C++,现在必须使用 return,最好使用 std::strtod(http://en.cppreference.com/w/cpp/string/byte/strtof):

double strtod( const char* str, char** str_end );

及其return值定义:

Return value

Floating point value corresponding to the contents of str on success. If the converted value falls out of range of corresponding return type, range error occurs and HUGE_VAL, HUGE_VALF or HUGE_VALL is returned. If no conversion can be performed, ​0​ is returned and *str_end is set to str.

正则表达式(即 libpcre)来拯救:

// checked_atof.cpp
#include <iostream>
#include <cstdlib>

#include <pcrecpp.h>

const char FP_RE[] = "^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?";

using namespace std;

int main()
{
  std:string s;
  double number;

  pcrecpp::RE fpre(FP_RE);

  cout << "Enter a floating point number: " << endl;
  cin >> s;

  if (!fpre.FullMatch(s)) {
    cout << "Sorry, not a valid floating point number!" << endl;
  } else {
    number = atof(s.c_str());
    cout << "Ok, result: " << number << endl;
  }

  return 0;
}

有关 installation/compilation 的详细信息,请参阅 libpcre 文档 -- 以下内容可能适用于您的系统:

g++ checked_atof.cpp $(pkg-config --cflags libpcrecpp) $(pkg-config --libs libpcrecpp) -o checked_atof

$ ./checked_atof.exe
Enter a floating point number:
23.42
Ok, result: 23.42

$ ./checked_atof.exe
Enter a floating point number:
3.14159e-4
Ok, result: 0.000314159

$ ./checked_atof.exe
Enter a floating point number:
x9
Sorry, not a valid floating point number!