logo

Convertir cadena a int en C

Convertir string a int es una tarea recurrente en el mundo de la programación. A pesar de ser una tarea sencilla, muchos programadores fallan o se confunden al realizarla. La conversión se realiza principalmente para que podamos realizar operaciones sobre números almacenados como cadenas.

Ejemplo:



cadena = 163 ″

numero=163

C es un lenguaje fuertemente tipado. Recibiremos un error si intentamos ingresar un valor que no sea aceptable con el tipo de datos. No solo en las entradas sino que obtendremos un error al realizar las operaciones.



Existen 3 métodos para convertir una cadena a int que son los siguientes:

    Usando atoi( ) Usando bucles Usando sscanf()

1. Conversión de cadenas usando atoi()

La función atoi() en C toma una matriz de caracteres o una cadena literal como argumento y devuelve su valor en un entero . Se define en el archivo de cabecera.

si observas remolcar() un poco más cerca descubrirás que significa:



Desglose de atoi() en términos simples

Desglose de atoi() en términos simples

Ejemplo:

C


c booleano



// C program to demonstrate the> // functioning of the atoi() function> #include> #include> int> main()> {> >char>* str1 =>'141'>;> >char>* str2 =>'3.14'>;> > >// explicit type casting> >int> res1 =>atoi>(str1);> >// explicit type casting> >int> res2 =>atoi>(str2);> > >printf>(>'atoi(%s) is %d '>, str1, res1);> >printf>(>'atoi(%s) is %d '>, str2, res2);> > >return> 0;> }>

>

>

Producción

atoi(141) is 141 atoi(3.14) is 3>

Atoi se comporta un poco diferente con las cuerdas. Veamos cómo:

Ejemplo:

C




// C Program to implement> // Atoi function with char array> #include> #include> > int> main()> {> >char>* str1 =>'Geek 12345'>;> >char>* str2 =>'12345 Geek'>;> > >int> num1 =>atoi>(str1);> >int> num2 =>atoi>(str2);> > >printf>(>'%d is of '%s' '>, num1, str1);> >printf>(>'%d is of '%s' '>, num2, str2);> > >return> 0;> }>

>

>

Producción

0 is of 'Geek 12345' 12345 is of '12345 Geek'>

Explicación:

  • Geek 12345 aquí 'Geek' es la primera palabra, por lo que la respuesta será: 0 (sin número)
  • 12345 Geek aquí '12345' es la primera palabra, por lo que la respuesta será: 12345

2. Usando bucles

Podemos usar bucles para convertir una cadena en un número entero recorriendo cada elemento de la cadena uno por uno y comparando los caracteres numéricos con sus valores ASCII para obtener sus valores numéricos y usando algunas matemáticas para generar el número entero. El siguiente ejemplo demuestra cómo hacerlo.

Ejemplo:

C




// C Program to convert string> // into integer using for loop> #include> #include> > int> main()> {> >char>* str =>'4213'>;> >int> num = 0;> > >// converting string to number> >for> (>int> i = 0; str[i] !=>' '>; i++) {> >num = num * 10 + (str[i] - 48);> >}> > >// at this point num contains the converted number> >printf>(>'%d '>, num);> >return> 0;> }>

>

>

Producción

4213>

Nota: Hemos utilizado str[i] – 48 para convertir el carácter numérico a sus valores numéricos. Por ej. El valor ASCII del carácter '5' es 53, por lo que 53 – 48 = 5, que es su valor numérico.

3. Usando sscanf()

Podemos usar sscanf() para convertir fácilmente una cadena en un número entero. Esta función lee la entrada formateada de la cadena.

Sintaxis de sscanf:

int sscanf (const char * source, const char * formatted_string, ...);>

Parámetros :

    fuente: cadena fuente. cadena_formateada: una cadena que contiene el especificadores de formato . …: – lista de argumentos de variables que contiene la dirección de las variables en las que queremos almacenar los datos de entrada.

Debe haber al menos tantos argumentos como el número de valores almacenados por los especificadores de formato. En caso de éxito, la función devuelve el número de variables completadas. En el caso de un error de entrada, antes de que se puedan leer correctamente los datos, se devuelve EOF.

Ejemplo:

C




// C program to demonstrate> // the working of SSCANF() to> // convert a string into a number> #include> > int> main()> {> >const> char>* str1 =>'12345'>;> >const> char>* str2 =>'12345.54'>;> >int> x;> > >// taking integer value using %d format specifier for> >// int> >sscanf>(str1,>'%d'>, &x);> >printf>(>'The value of x : %d '>, x);> > >float> y;> >// taking float value using %f format specifier for> >// float> >sscanf>(str2,>'%f'>, &y);> >printf>(>'The value of x : %f '>, y);> > >return> 0;> }>

>

>

Producción

The value of x : 12345 The value of x : 12345.540039>

¿Podemos encasillar String a int?

La respuesta es NO . Si usamos encasillamiento para convertir la cadena en un número, obtendremos un error como se muestra en el siguiente ejemplo.

Ejemplo:

C




recorrido de preorden
// C Program to check the output> // of typecasting from string to integer> #include> > int> main()> {> >string str =>'8'>;> >int> num;> > >// Typecasting> >num = (>int>)str;> >return> 0;> }>

>

>

Producción:

main.c: In function ‘main’: main.c:9:11: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 9 | num = (int)str; | ^ 1683652612>

Explicación: Como ambos string e int no están en la misma jerarquía de objetos , nosotros no se puede realizar conversión de tipos implícita o explícita como podemos hacer en caso de conversión de doble a int o flotante a int.

En el código anterior, podemos ver que el resultado da la advertencia con cualquier valor basura dentro. Entonces, para evitar tales condiciones, utilizamos los métodos especificados anteriormente.