2012-09-11 15 views
7

¿Cómo detectar si atof o _wtof failes para convertir la cadena a double? Pero no tratando de verificar si el resultado es diferente a 0.0 porque mi entrada puede ser 0.0. ¡Gracias!¿Cómo detectar si atof o _wtof failes?

+2

Acabas de descubrir la razón por la cual el uso de las funciones de atoX es malo. – PlasmaHH

Respuesta

11

No utilice atof. En su lugar, utilice strtod, desde <cstdlib>, y también comprobar errno de <cerrno>:

// assume: "char * mystr" is a null-terminated string 

char * e; 
errno = 0; 
double x = std::strtod(mystring, &e); 

if (*e != '\0' || // error, we didn't consume the entire string 
    errno != 0) // error, overflow or underflow 
{ 
    // fail 
} 

El puntero e puntos uno más allá del último carácter consumido. También puede marcar e == mystr para ver si se consumieron los caracteres.

También hay std::wcstod para trabajar con wchar_t -cadenas, desde <cwstring>.

En C++ 11 también tiene std::to_string/std::to_wstring, desde <string>, pero creo que se produce una excepción si falla la conversión, que puede no ser un modo de fallo deseable cuando se trata de datos externos.

+0

@TerranceCohen: No. (Pero es posible que aún desee comprobar 'errno' para detectar el exceso y el defecto). –

1

Usando atof, no puede. Pero como esto es C++, sugiero que use un std::stringstream y que lo compruebe con operator ! después de aplicar operator >> a double.

Cuestiones relacionadas