Saltar al contenido

Convertir char array a un número int en C

Este escrito ha sido aprobado por especialistas para asegurar la veracidad de nuestra esta noticia.

Solución:

Personalmente no me gusta atoi función. Yo sugeriría sscanf:

char myarray[5] = '-', '1', '2', '3', '';
int i;
sscanf(myarray, "%d", &i);

Es muy estándar, está en el stdio.h Biblioteca 🙂

Y en mi opinión, te permite mucha más libertad que atoi, formato arbitrario de su número-string, y probablemente también permita caracteres no numéricos al final.

EDITAR
Acabo de encontrar esta maravillosa pregunta aquí en el sitio que explica y compara 3 formas diferentes de hacerlo: atoi, sscanf y strtol. Además, hay una buena información más detallada sobre sscanf (en realidad, toda la familia de *scanf funciones).

EDIT2
Parece que no solo a mí personalmente me disgusta el atoi función. Aquí hay un enlace a una respuesta que explica que el atoi La función está obsoleta y no debe usarse en un código más nuevo.

¿Por qué no usar simplemente atoi? Por ejemplo:

char myarray[4] = '-','1','2','3';

int i = atoi(myarray);

printf("%dn", i);

Me da, como esperaba:

-123

Actualización: por qué no – el personaje array no es null terminado. Doh!

No es tan difícil lidiar con el personaje. array sí mismo sin convertir el array a un string. Especialmente en el caso donde la longitud del carácter array se conoce o se puede encontrar fácilmente. Con el personaje array, la longitud debe determinarse en el mismo ámbito que el array definición, por ejemplo:

size_t len sizeof myarray/sizeof *myarray;

Para cuerdas, por supuesto, tienes strlen disponible.

Con la longitud conocida, sin importar si se trata de un personaje array o un string, puede convertir los valores de los caracteres en un número con una función corta similar a la siguiente:

/* convert character array to integer */
int char2int (char *array, size_t n)
    
    int number = 0;
    int mult = 1;

    n = (int)n < 0 ? -n : n;       /* quick absolute value check  */

    /* for each character in array */
    while (n--)
     array[n] > '9') && array[n] != '-') 
            if (number)
                break;
            else
                continue;
        

        if (array[n] == '-')       /* if '-' if number, negate, break */
            if (number) 
                number = -number;
                break;
            
        
        else                       /* convert digit to numeric value   */
            number += (array[n] - '0') * mult;
            mult *= 10;
        
    

    return number;

Lo anterior es simplemente el enfoque de conversión estándar de char a int con algunos condicionales adicionales incluidos. Para manejar personajes extraviados, además del digits y '-', el único truco es tomar decisiones inteligentes sobre cuándo comenzar a recopilar dígitos y cuándo detenerse.

Si empiezas a coleccionar digits para la conversión cuando encuentre el primer digit, la conversión finaliza cuando se encuentra el primer '-' o non-digit. Esto hace que la conversión sea mucho más conveniente cuando está interesado en índices como (p. Ej. file_0127.txt).

Un breve ejemplo de su uso:

#include 
#include 
#include 

int char2int (char *array, size_t n);

int main (void) 

    char myarray[4] = '-','1','2','3'; 
    char *string = "some-goofy-string-with-123-inside";
    char *fname = "file-0123.txt";

    size_t mlen = sizeof myarray/sizeof *myarray;
    size_t slen = strlen (string);
    size_t flen = strlen (fname);

    printf ("n myarray[4] = '-','1','2','3';nn");
    printf ("   char2int (myarray, mlen):  %dnn", char2int (myarray, mlen));

    printf (" string = "some-goofy-string-with-123-inside";nn");
    printf ("   char2int (string, slen) :  %dnn", char2int (string, slen));

    printf (" fname = "file-0123.txt";nn");
    printf ("   char2int (fname, flen)  :  %dnn", char2int (fname, flen));

    return 0;

Nota: cuando se enfrenta a '-' índices de archivos delimitados (o similares), depende de usted negar el resultado. (p.ej file-0123.txt en comparación con file_0123.txt donde volvería el primero -123 mientras que el segundo 123).

Salida de ejemplo

$ ./bin/atoic_array

 myarray[4] = '-','1','2','3';

   char2int (myarray, mlen):  -123

 string = "some-goofy-string-with-123-inside";

   char2int (string, slen) :  -123

 fname = "file-0123.txt";

   char2int (fname, flen)  :  -123

Nota: siempre hay casos de esquina, etc. que pueden causar problemas. Esto no pretende ser 100% a prueba de balas en todos los conjuntos de caracteres, etc., sino que funciona la mayoría de las veces y proporciona una flexibilidad de conversión adicional sin el análisis inicial o la conversión a string Requerido por atoi o strtoletc.

Si piensas que ha resultado provechoso este post, sería de mucha ayuda si lo compartes con el resto entusiastas de la programación de esta manera nos ayudas a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *