¿Cuál es la forma más segura y mejor de recuperar un largo sin firmar de una cadena en C++?¿Cómo se obtiene un largo sin firmar de una cuerda?
Conozco una serie de métodos posibles.
En primer lugar, la conversión de un largo firmado tomado de atol.
char *myStr; // Initalized to some value somehow.
unsigned long n = ((unsigned)atol(myStr));
El problema obvio con esto es, ¿qué sucede cuando el valor almacenado en myStr es más grande que un largo firmado puede contener? ¿Qué recupera el atol?
La próxima posibilidad es usar strtoul.
char *myStr; // Initalized to some value somehow.
unsigned long n = strtoul(myStr, 0, 10);
Sin embargo, esto es un poco más complicado para mis necesidades. Me gustaría una función simple, string in, unsigned long base 10 out. Además, el manejo de errores deja mucho que desear.
La última posibilidad que he encontrado es usar sscanf.
char *myStr; // Initalized to some value somehow.
unsigned long n = 0;
if(sscanf(myStr, "%lu", n) != 1) {
//do some error handling
}
Una vez más, el manejo de errores deja mucho que desear, y un poco más complicado de lo que me gustaría.
La opción obvia restante es escribir mi propia envoltura alrededor de una de las posibilidades anteriores o algo que pase por la cadena y convierta manualmente cada dígito hasta que alcance ULONG_MAX.
Mi pregunta es, ¿cuáles son las otras opciones que mi google-fu no ha podido encontrar? ¿Alguna cosa en la biblioteca estándar de C++ que convertirá limpiamente una cadena a una longitud sin signo y arrojará excepciones en caso de error?
Mis disculpas si esto es una tontería, pero no pude encontrar ninguna pregunta que coincidiera exactamente con la mía.
'atol':" Si el valor correcto está fuera del rango de valores representables, se devuelve LONG_MAX o LONG_MIN ". http://www.cplusplus.com/reference/clibrary/cstdlib/atol/ –
Preguntas para parejas, aunque no estoy seguro si son duplicados: (1) http://stackoverflow.com/questions/1243428/convert- string-to-int-with-bool-fail-in-c/1243435 (2) http://stackoverflow.com/questions/1435253/c-syntax-question-if-var-type-int/1435268 – GManNickG
Yo don No entiendo lo que tienes contra Strtoul. Es la función perfecta para esto. Pase un 0 por la base y convertirá los números con cualquier cadena de prefijo base que su biblioteca C entienda, como "0x". –