atoi () – cadena a int

Leí que atoi() está en desuso y que es equivalente a:

 (int)strtol(token_start, (char **)NULL, 10); 

¿ atoi(chr) significa que debo usar lo anterior en lugar de atoi(chr) o simplemente está diciendo que son equivalentes?

Dice en la página de manual de Mac OS X de Apple para atoi (3) (y también en las páginas de manual de BSD) que atoi ha quedado en desuso.

La función atoi () ha sido desaprobada por strtol () y no debe usarse en el nuevo código.

strtol() equivalente de strtol() solo por esa razón, pero dudo que tenga que preocuparse por la atoi() de atoi() .

de http://www.codecogs.com/library/computing/c/stdlib.h/atoi.php Notas de implementación

 * The atoi function is not thread-safe and also not async-cancel safe. * The atoi function has been deprecated by strtol and should not be used in new code. 

atoi no está en desuso, su fuente es incorrecta. Nada en la norma C actual ISO 9899: 2011 lo indica (consulte, por ejemplo, el capítulo 6.11, direcciones de idiomas futuras), ni nada en las normas anteriores.

Según el estándar C, atoi es equivalente a strtol como sigue, C11 7.22.1.2:

Las funciones atoi, atol y atolón convierten la parte inicial de la cadena apuntada por nptr a int, long int y long long int, respectivamente.

Excepto por el comportamiento en error, son equivalentes a

atoi: (int)strtol(nptr, (char **)NULL, 10)

atol: strtol(nptr, (char **)NULL, 10)

atoll: strtoll(nptr, (char **)NULL, 10)

Se prefiere strtol, ya que atoi invoca un comportamiento indefinido en caso de error. Consulte 7.22.1 “Si el valor del resultado no se puede representar, el comportamiento no está definido”.

La descripción de atoi() tiene un punto muy importante en relación con las similitudes / diferencias con strtol()

> ... The call atoi(str) shall be equivalent to:
> (int) strtol(str, (char **)NULL, 10)
> except that the handling of errors may differ.

Prueba esto por diversión:

 const char *buf = "forty two"; int t1 = atoi(buf); /* detect errors? */ int t2 = strtol(buf, NULL, 10); /* detect errors? */ 

No, no debes usar lo anterior en lugar de atoi .

En realidad, debe verificar la información de error que strtol pone a disposición:

 i = atoi(s); 

debe ser reemplazado por

 char* stopped; i = (int)strtol(s, &stopped, 10); if (*stopped) { /* handle error */ } 

significa que en un momento dado atoi ya no estará disponible. Así que empieza a cambiar tu código ahora