leí que atoi()
es obsoleto y que es equivalente a:atoi() - cadena para int
(int)strtol(token_start, (char **)NULL, 10);
¿Eso significa que debería utilizar el anterior lugar de atoi(chr)
o es simplemente diciendo que son equivalentes?
leí que atoi()
es obsoleto y que es equivalente a:atoi() - cadena para int
(int)strtol(token_start, (char **)NULL, 10);
¿Eso significa que debería utilizar el anterior lugar de atoi(chr)
o es simplemente diciendo que son equivalentes?
Dice en el Mac OS X Manual Page for atoi(3) de Apple (y en las páginas del manual BSD también) que atoi
ha quedado obsoleto.
La función atoi() ha quedado obsoleta por strtol() y no debe ser utilizada en el nuevo código.
me gustaría utilizar el strtol()
equivalente sólo por esa razón, pero dudo que tenga que preocuparse de atoi()
de ser removido.
de
http://www.codecogs.com/library/computing/c/stdlib.h/atoi.php Notas de Aplicació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.
¿No depende solo de la implementación interna del 'atoi 'si es seguro para subprocesos o no? Si no es así, ¿qué hace que no sea seguro para subprocesos? – SasQ
Deben haber intentado realmente hacerlo no tan seguro. La implementación ingenua sí lo es. –
Enlace roto a fuente no autorizada ... –
significa que en un punto en el tiempo atoi ya no estará disponible. Así que comience a cambiar su código ahora
Obtengo esa parte, pero me preguntaba si la implementación de atoi acaba de llamar al código anterior. – user105033
Esto es incorrecto, citación necesaria. Nada en el estándar actual de C indica que atoi está en desuso. Y esto es 6 años después de que se hizo esta respuesta, siendo C11 el estándar activo. – Lundin
El description of atoi()
tiene un punto muy importante en relación con las similitudes/diferencias a strtol()
> ... The call atoi(str) shall be equivalent to:
> (int) strtol(str, (char **)NULL, 10)
> except that the handling of errors may differ.
probar esto por diversión:
const char *buf = "forty two";
int t1 = atoi(buf); /* detect errors? */
int t2 = strtol(buf, NULL, 10); /* detect errors? */
He intentado con tu código en mi compilador (GCC) y ambos me dieron '0', así que no veo ninguna diferencia: | – SasQ
Hmmm, mi mal! Gracias @SasQ. Pensé que 'strtol' tenía que configurar' errno' en el error, pero en el caso específico de mi código de prueba anterior, no. – pmg
@pmg Su código de prueba no parece verificar 'errno' en absoluto. – Dan
No, usted no debería usar el anterior en lugar de atoi
.
En realidad debería comprobar la información de error que pone a disposición strtol
:
i = atoi(s);
debe sustituirse por
char* stopped;
i = (int)strtol(s, &stopped, 10);
if (*stopped) { /* handle error */ }
atoi
no está en desuso, su fuente es incorrecta. Nada en el estándar actual de C ISO 9899: 2011 indica esto (consulte, por ejemplo, el capítulo 6.11 direcciones futuras del lenguaje) ni nada en normas anteriores.
según el estándar C, atoi es equivalente a strtol como sigue, C11 7.22.1.2:
El atoi, Atol, y funciones atolones convierten la porción inicial de la cadena apuntado por nptr a representación int, long int y long long int , respectivamente.
Excepto para el comportamiento en caso de error, que 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, como atoi invoca un comportamiento indefinido a error. Consulte 7.22.1 "Si no se puede representar el valor del resultado, el comportamiento no está definido".
(Sí, sé que esta pregunta es muy antigua, pero la respuesta aceptada es incorrecta, tuvo que ser aclarada) – Lundin
"Si no se puede representar el valor del resultado, el comportamiento no está definido". Sin duda, esto hace que la función sea completamente inutilizable, y es motivo suficiente para considerar que la función se ha depreciado efectivamente. –
@WilliamPursell De hecho. Déle al comité estándar de C un par de décadas más y se darán cuenta. Por ejemplo, les llevó 22 años eliminar 'gets'. El verdadero epítome de la eficiencia y la iniciativa. Compare esto con el estándar de subconjunto seguro MISRA-C, que prohibió todo uso de las funciones ato * ya en 1998. – Lundin
Mi problema con 'atoi':' assert (atoi ("0")! = Atoi (! Blah "))' – sbi