2012-07-01 10 views
6

according documentation:Come posso assicurarmi che strtol() sia ritornato correttamente?

caso di successo, la funzione restituisce il numero intero convertito come valore int lungo . Se non è possibile eseguire una conversione valida, viene restituito un valore zero . Se il valore corretto non rientra nell'intervallo dei valori rappresentabili , viene restituito LONG_MAX o LONG_MIN e la variabile globale errno è impostata su ERANGE.

consideri strtol(str, (char**)NULL, 10); se str è "0\0" Come sapere se la funzione non è riuscita oppure solo ha trasformato la stringa con "0" numero?

+1

avete considerato 'scanf'? –

+2

@StevenLuu: 'scanf' ha una gestione degli errori ancora peggiore. Alcune implementazioni generalmente ti danno spazzatura in overflow, ma senza segnalare l'errore in alcun modo. –

risposta

11

È necessario passare un vero e proprio indirizzo di puntatore se si vuole il controllo degli errori, in modo da poter distinguere i 0 valori derivanti dalla "0" e simile da 0 valori derivanti dalla "pqr":

char *endptr; 
errno = 0; 
long result = strtol(str, &endptr, 10); 
if (endptr == str) 
{ 
    // nothing parsed from the string, handle errors or exit 
} 
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE) 
{ 
    // out of range, handle or exit 
} 
// all went fine, go on 
+0

Lo provo ! Grazie! – Jack

+0

Daniel: Ho bisogno di chiederti poche cose. Puoi per favore venire a [questa chat] (http://chat.stackoverflow.com/rooms/4064/haskell)? – Nawaz

+0

perché non solo "if (errno == ERANGE)" per verificare l'insuccesso? – Undefined

1

È possibile controllare la errno o passare un valore non nullo per il secondo argomento e confrontare il suo valore risultante str, come:

char * endptr; 
long result = strtol(str, &endptr, 10); 
if (endptr > str) 
{ 
    // Use result... 
} 
1

IMHO, preferisco sscanf()-atoi() o strtol(). La ragione principale è che non sipossibile controllare in modo affidabile per stato di errore su alcune piattaforme (vale a dire di Windows) a meno che non si utilizzasscanf() (che restituisce 1 se si riuscisse, e se non si riesce 0).

+0

Perché non riesco a verificare lo stato di errore su alcune piattaforme? IMHO: 'strtol()' potrebbe restituire un valore negativo in caso di errore .. – Jack

+0

@Jack long può anche essere negativo. – Turix

+0

'scanf' NON restituisce un errore in caso di overflow. L'errore di conversione è semplice con 'strtol', solo l'overflow è fastidioso da controllare. –

Problemi correlati