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?
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?
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.
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
Devono aver provato davvero difficile non renderlo thread-safe L'implementazione ingenua è sicura –
fonte non autorevole ... –
significa che ad un certo punto atoi non sarà più disponibile. Quindi inizia a cambiare il tuo codice ora
Ricevo quella parte, ma mi chiedevo se l'implementazione di atoi avesse appena chiamato il codice sopra. – user105033
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
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? */
Ho provato il codice sul mio compilatore (GCC) ed entrambi mi hanno dato '0', quindi non vedo alcuna differenza: | – SasQ
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
@ pmg Sembra che il tuo codice di test non controlli affatto "errno". – Dan
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 */ }
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."
(Sì, so che questa domanda è terribilmente vecchia ma la risposta accettata è errata, ha dovuto essere chiarita) – Lundin
"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. –
@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
Il mio problema con 'atoi':' assert (atoi ("0")! = Atoi (! Blah "))' – sbi