strtol
le ofrece más flexibilidad, ya que realmente puede decirle si toda la cadena se convirtió en un número entero o no. atol
, cuando es incapaz de convertir la cadena en un número (como en atol("help")
), devuelve 0, que es indistinguible de atol("0")
:
int main()
{
int res_help = atol("help");
int res_zero = atol("0");
printf("Got from help: %d, from zero: %d\n", res_help, res_zero);
return 0;
}
Salidas:
Got from help: 0, from zero: 0
strtol
especificará, mediante su argumento endptr
, donde la conversión falló
int main()
{
char* end;
int res_help = strtol("help", &end, 10);
if (!*end)
printf("Converted successfully\n");
else
printf("Conversion error, non-convertible part: %s", end);
return 0;
}
Salidas:
Conversion error, non-convertible part: help
Por lo tanto, para cualquier programación seria, sin duda recomiendo el uso de strtol
. Es un poco más complicado de usar, pero esto tiene una buena razón, como expliqué anteriormente.
atol
puede ser adecuado solo para casos muy simples y controlados.
Creo en su ejemplo, la condición debe ser 'if (! * End)'. Señalará el terminador nulo de la cadena (si se convirtió todo) pero no se establecerá en NULL. –
@Jeff M: tienes razón, perdón error –
¿Se aplica esta misma lógica a la función del núcleo de Linux 'simple_strtol'? No puedo obtener la condición 'if (! * End)' para evaluar a verdadero, usando su modelo exacto. –