Parsear números como se debe en C
strtol reporta dónde se detuvo y marca errno al desbordarse — atoi no hace ninguna de las dos.
#include <errno.h>
#include <stdlib.h>
int parse_int(const char *text, long *out) {
if (text == NULL || *text == '\0') {
return 0;
}
errno = 0;
char *end = NULL;
long value = strtol(text, &end, 10);
if (end == text || *end != '\0') {
return 0;
}
if (errno == ERANGE) {
return 0;
}
*out = value;
return 1;
}
double parse_double(const char *text, int *ok) {
char *end = NULL;
double value = strtod(text, &end);
*ok = (end != text && *end == '\0');
return value;
}
Cómo funciona
endapunta al primer carácter no consumido.errno == ERANGEmarca un valor fuera de rango.- Que haya consumido la cadena entera significa un parseo limpio.
Palabras clave y builtins usados aquí
NULLcharconstdoubleifintlongreturn
El intento, en números
- Líneas
- 27
- Caracteres a escribir
- 464
- Tokens
- 158
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 95 segundos.
Paso 2 de 3 en Dividir y parsear; paso 9 de 13 en Cadenas y texto.