typestar

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

  1. end apunta al primer carácter no consumido.
  2. errno == ERANGE marca un valor fuera de rango.
  3. Que haya consumido la cadena entera significa un parseo limpio.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Dividir y parsear; paso 9 de 13 en Cadenas y texto.

← Anterior Siguiente →