2012-07-01 22 views
6

according documentation:¿Cómo me aseguro de que strtol() haya regresado correctamente?

En caso de éxito, la función devuelve el número entero convertido como mucho valor int. Si no se puede realizar una conversión válida, se devuelve un valor cero. Si el valor correcto está fuera del rango de valores representables, se devuelve LONG_MAX o LONG_MIN y la variable global variable errno se establece en ERANGE.

Considere strtol(str, (char**)NULL, 10); si se str"0\0" ¿Cómo saber si la función falló o sólo ha convertido a la cadena con "0" número?

+1

¿ha considerado 'scanf'? –

+2

@StevenLuu: 'scanf' tiene un peor manejo de errores. Algunas implementaciones generalmente le darán basura en desbordamiento, pero sin indicar el error de ninguna manera. –

Respuesta

11

Es necesario pasar una dirección de puntero real si quieres comprobación de errores, por lo que puede distinguir los valores 0 y derivados de "0" similar de valores que surgen de 0: "pqr"

char *endptr; 
errno = 0; 
long result = strtol(str, &endptr, 10); 
if (endptr == str) 
{ 
    // nothing parsed from the string, handle errors or exit 
} 
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE) 
{ 
    // out of range, handle or exit 
} 
// all went fine, go on 
+0

Lo intentaré ! ¡Gracias! – Jack

+0

Daniel: Necesito preguntarte algunas cosas. ¿Puedes venir a [este chat] (http://chat.stackoverflow.com/rooms/4064/haskell)? – Nawaz

+0

¿por qué no simplemente 'if (errno == ERANGE)' para verificar el error? – Undefined

1

Puede comprobar el errno o pasar un valor no nulo para el segundo argumento, y comparar el valor resultante a str, como:

char * endptr; 
long result = strtol(str, &endptr, 10); 
if (endptr > str) 
{ 
    // Use result... 
} 
1

en mi humilde opinión, prefiero sscanf() a atoi() o strtol(). La razón principal es que no puede comprobar de forma fiable durante un estado de error en algunas plataformas (es decir, de Windows) a menos que utilice sscanf() (que devuelve 1 si tiene éxito, y si no 0).

+0

¿Por qué no puedo verificar el estado de error en algunas plataformas? En mi humilde opinión: 'strtol()' podría devolver un valor negativo en la falla .. – Jack

+0

@Jack longs también puede ser negativo. – Turix

+0

'scanf' NO devuelve falla en desbordamiento. La falla de conversión es fácil con 'strtol', solo el desbordamiento es molesto de verificar. –

Cuestiones relacionadas