Come vortice ha fatto notare, le raccomandazioni per usare atoi
non sono davvero molto buona. atoi
non ha modo di indicare un errore, quindi si ottiene lo stesso risultato da atoi("0");
come da atoi("abc");
. Il primo è chiaramente significativo, ma il secondo è un chiaro errore.
Ha anche raccomandato strtol
, che è perfettamente soddisfacente, anche se un po 'goffo. Un'altra possibilità sarebbe quella di utilizzare sscanf
, qualcosa di simile:
if (1==sscanf(argv[1], "%d", &temp))
// successful conversion
else
// couldn't convert input
nota che strtol
dà risultati leggermente più dettagliati anche se - in particolare, se hai un argomento come 123abc
, la chiamata sscanf
sarebbe semplicemente dire che si era convertita un numero (123), mentre strtol
non solo ti comunicava che aveva convertito il numero, ma anche un puntatore allo a
(cioè, l'inizio della parte che poteva non convertire in un numero).
Poiché si utilizza C++, si potrebbe anche considerare l'utilizzo di boost::lexical_cast
. È quasi altrettanto semplice da utilizzare come atoi
, ma fornisce anche (approssimativamente) lo stesso livello di dettaglio negli errori di reporting come strtol
. La spesa più grande è che può generare eccezioni, quindi per utilizzarlo il codice deve essere protetto dalle eccezioni. Se stai scrivendo C++, dovresti farlo comunque, ma questo tipo di costringe il problema.
fonte
2010-05-09 14:41:51
Mi consiglia contro atoi: "La funzione atoi() è stata deprecata da strtol() e non deve essere usato in nuovo codice." – WhirlWind
Che dire del fatto che è impossibile stabilire se una conversione sia effettivamente avvenuta con 'atoi'? Questo sembrerebbe un buon motivo per evitare "atoi" per me. –
@WhirlWind Deprecato da chi? –