2009-09-28 11 views
9

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?

+3

Mi problema con 'atoi':' assert (atoi ("0")! = Atoi (! Blah "))' – sbi

Respuesta

9

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. 

+2

¿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

+2

Deben haber intentado realmente hacerlo no tan seguro. La implementación ingenua sí lo es. –

+2

Enlace roto a fuente no autorizada ... –

-2

significa que en un punto en el tiempo atoi ya no estará disponible. Así que comience a cambiar su código ahora

+0

Obtengo esa parte, pero me preguntaba si la implementación de atoi acaba de llamar al código anterior. – user105033

+3

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

4

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? */ 

+0

He intentado con tu código en mi compilador (GCC) y ambos me dieron '0', así que no veo ninguna diferencia: | – SasQ

+0

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

+0

@pmg Su código de prueba no parece verificar 'errno' en absoluto. – Dan

2

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 */ } 
8

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".

+1

(Sí, sé que esta pregunta es muy antigua, pero la respuesta aceptada es incorrecta, tuvo que ser aclarada) – Lundin

+1

"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. –

+0

@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