2009-09-28 12 views
9

ho letto che atoi() è deprecato e che è equivalente a:atoi() - stringa a int

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

Vuol dire che dovrei usare quanto sopra, invece di atoi(chr) o è solo dicendo che sono equivalenti?

+3

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

risposta

9

Si dice su Apple Mac OS X Manual Page for atoi(3) (e anche nelle pagine man BSD) che atoi è stato deprecato.

La funzione atoi() è stata deprecata da strtol() e non deve essere utilizzata nel nuovo codice.

Vorrei utilizzare il strtol() equivalente solo per questo motivo, ma dubito che si deve preoccupare di atoi() di essere rimosso.

da http://www.codecogs.com/library/computing/c/stdlib.h/atoi.php attuazione rileva

* 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

Non dipende solo dall'implementazione interna di atoi 'Se è sicuro per i thread o no? Se non lo è, allora cosa lo rende non thread-safe all'esterno? – SasQ

+2

Devono aver provato davvero difficile non renderlo thread-safe L'implementazione ingenua è sicura –

+2

fonte non autorevole ... –

-2

significa che ad un certo punto atoi non sarà più disponibile. Quindi inizia a cambiare il tuo codice ora

+0

Ricevo quella parte, ma mi chiedevo se l'implementazione di atoi avesse appena chiamato il codice sopra. – user105033

+3

Questo è errato, citazione necessaria Nulla nello standard C corrente indica che atoi è deprecato e questo è 6 anni dopo che questa risposta è stata fatta, con C11 come standard attivo – Lundin

4

Il description of atoi() ha un punto molto importante in relazione alle somiglianze/differenze con strtol()

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

Prova questo per divertimento:

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

+0

Ho provato il codice sul mio compilatore (GCC) ed entrambi mi hanno dato '0', quindi non vedo alcuna differenza: | – SasQ

+0

Hmmm, mio ​​male! Grazie a @SasQ. Ho pensato che 'strtol' ha dovuto impostare 'errno' per errore, ma nel caso specifico del mio codice di test sopra, non lo è. – pmg

+0

@ pmg Sembra che il tuo codice di test non controlli affatto "errno". – Dan

2

No, non si deve utilizzare il sopra al posto di atoi.

si dovrebbe effettivamente controllare le informazioni di errore che strtol mette a disposizione:

i = atoi(s); 

dovrebbe essere sostituito da

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

atoi non è deprecato, la sorgente non è corretto. Nulla nell'attuale standard C ISO 9899: 2011 indica questo (si veda ad esempio il capitolo 6.11 future indicazioni linguistiche), né nulla in standard precedenti.

Secondo lo standard C, atoi è equivalente a strtol come segue, C11 7.22.1.2:

L'atoi, Atol e funzioni atollo convertono la porzione iniziale della stringa puntata da nptr a int, long int e long long int rappresentazione rispettivamente, .

Fatta eccezione per il comportamento in caso di errore, sono equivalenti a

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

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

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

strtol è preferito, come atoi invoca comportamento indefinito in caso di errore. Vedere 7.22.1 "Se il valore del risultato non può essere rappresentato, il comportamento di non è definito."

+1

(Sì, so che questa domanda è terribilmente vecchia ma la risposta accettata è errata, ha dovuto essere chiarita) – Lundin

+1

"Se il valore del risultato non può essere rappresentato, il comportamento non è definito". Sicuramente questo rende la funzione completamente inutilizzabile, ed è una ragione sufficiente per considerare la funzione effettivamente deprecata. –

+0

@WilliamPursell Infatti. Dare il comitato standard C un paio di decenni più e potrebbero realizzare. Ad esempio, ci sono voluti 22 anni per rimuovere 'gets'. La vera epitome di efficienza e iniziativa. Confrontiamolo con lo standard dei sottoinsiemi sicuri MISRA-C, che ha vietato l'uso delle funzioni ato * fin dal 1998. – Lundin