Qual è il modo più sicuro e migliore per recuperare un long senza segno da una stringa in C++?Come si ottiene un lungo senza segno da una stringa?
Conosco un certo numero di metodi possibili.
In primo luogo, la conversione di un lungo firmato presa da atol.
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
Il problema evidente con questo è, che cosa accade quando il valore memorizzato in myStr è più grande di una firma lunga può contenere? Cosa recupera atol?
La prossima possibilità è usare strtoul.
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
Tuttavia, questo è un po 'complicato per le mie esigenze. Mi piacerebbe una semplice funzione, una stringa, una base lunga senza segno 10 fuori. Inoltre, la gestione degli errori lascia molto a desiderare.
L'ultima possibilità che ho trovato è quella di usare sscanf.
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
Ancora una volta, la gestione degli errori lascia molto a desiderare e un po 'più complicata di quanto mi piacerebbe.
L'opzione ovvia rimanente è scrivere da solo un wrapper attorno a una delle possibilità precedenti o qualcosa che passa attraverso la stringa e converte manualmente ogni cifra fino a raggiungere ULONG_MAX.
La mia domanda è: quali sono le altre opzioni che il mio google-fu non è riuscito a trovare? Qualunque cosa nella libreria std C++ che convertirà in modo pulito una stringa in una lunga non firmata e genererà eccezioni in caso di errore?
Mi scuso se questo è un problema, ma non ho trovato nessuna domanda che corrispondesse esattamente alla mia.
'atol':" Se il valore corretto non rientra nell'intervallo di valori rappresentabili, viene restituito LONG_MAX o LONG_MIN. " http://www.cplusplus.com/reference/clibrary/cstdlib/atol/ –
Domande di coppia, non sono sicuro se sono duplicati però: (1) http://stackoverflow.com/questions/1243428/convert- string-to-int-con-bool-fail-in-c/1243435 (2) http://stackoverflow.com/questions/1435253/c-syntax-question-if-var-type-int/1435268 – GManNickG
I don capisco cosa hai contro strtoul. È la funzione perfetta per questo. Passa uno 0 per la base e convertirà i numeri con qualsiasi stringa di prefisso di base che la tua libreria C comprende, come "0x". –