strtol
fornisce una maggiore flessibilità, in quanto può effettivamente dire se l'intera stringa è stata convertita in un numero intero o meno. atol
, quando in grado di convertire la stringa in un numero (come in atol("help")
), restituisce 0, che è indistinguibile da atol("0")
:
int main()
{
int res_help = atol("help");
int res_zero = atol("0");
printf("Got from help: %d, from zero: %d\n", res_help, res_zero);
return 0;
}
Uscite:
Got from help: 0, from zero: 0
strtol
specificherà, utilizzando il suo argomento endptr
, dove la conversione è fallita.
int main()
{
char* end;
int res_help = strtol("help", &end, 10);
if (!*end)
printf("Converted successfully\n");
else
printf("Conversion error, non-convertible part: %s", end);
return 0;
}
Uscite:
Conversion error, non-convertible part: help
Pertanto, per qualsiasi programmazione seria, ho sicuramente consiglio di usare strtol
. È un po 'più complicato da usare, ma questo ha una buona ragione, come ho spiegato sopra.
atol
può essere adatto solo per casi molto semplici e controllati.
fonte
2010-09-25 05:54:57
Credo nel tuo esempio, la condizione dovrebbe essere 'if (! * End)'. Punterà al terminatore null della stringa (se è stato tutto convertito) ma non sarà impostato su NULL stesso. –
@Jeff M: hai ragione, mi spiace digitare –
Questa stessa logica si applica alla funzione del kernel linux 'simple_strtol'? Non riesco a ottenere la condizione 'if (! * End)' per valutare true, usando il modello esatto. –