logo

Converteix String a int en C

Convertir string a int és una tasca recurrent en el món de la programació. Tot i ser una tasca senzilla, molts programadors fallen o es confonen mentre fan això. La conversió es fa principalment perquè puguem realitzar operacions sobre números que s'emmagatzemen com a cadenes.

Exemple:



str=163'

nombre=163

C és un llenguatge molt tipificat. Tindrem un error si intentem introduir un valor que no és acceptable amb el tipus de dades. No només en les entrades, sinó que obtindrem un error mentre realitzem les operacions.



Hi ha 3 mètodes per convertir una cadena a int que són els següents:

    Ús d'atoi() Ús de bucles Ús de sscanf()

1. Conversió de cadenes mitjançant atoi( )

La funció atoi() en C pren una matriu de caràcters o una cadena literal com a argument i retorna el seu valor en un enter . Es defineix a la fitxer de capçalera.

Si observeu remolc () una mica més a prop, descobrireu que significa:



Desglossament d'atoi() en termes senzills

Desglossament d'atoi() en termes senzills

Exemple:

C




// 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;> }>

100 km/h en mph
>

>

Sortida

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

Atoi es comporta una mica diferent per a la cadena. Comprovem com:

Exemple:

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;> }>

>

>

Sortida

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

Explicació:

  • Geek 12345 aquí 'Geek' és la primera paraula, de manera que la resposta serà: 0 (Sense nombre)
  • 12345 Geek aquí '12345' és la primera paraula, així que la resposta serà: 12345

2. Ús de bucles

Podem utilitzar bucles per convertir una cadena en un enter recorrent cada element de la cadena un per un i comparant els caràcters numèrics amb els seus valors ASCII per obtenir els seus valors numèrics i utilitzant algunes matemàtiques per generar l'enter. L'exemple següent mostra com fer-ho.

Exemple:

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;> }>

>

>

ordenació d'inserció
Sortida

4213>

Nota: hem utilitzat str[i] – 48 per convertir el caràcter numèric als seus valors numèrics. Per ex. El valor ASCII del caràcter '5' és 53, de manera que 53 – 48 = 5, que és el seu valor numèric.

3. Utilitzant sscanf()

Podem utilitzar sscanf() per convertir fàcilment una cadena en un enter. Aquesta funció llegeix l'entrada formatada de la cadena.

Sintaxi de sscanf:

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

Paràmetres :

    font - cadena font. formatted_string: una cadena que conté el fitxer especificadors de format . … : – llista d'arguments de variables que conté l'adreça de les variables en les quals volem emmagatzemar les dades d'entrada.

Hi hauria d'haver almenys tants d'aquests arguments com el nombre de valors emmagatzemats pels especificadors de format. En cas d'èxit, la funció retorna el nombre de variables omplertes. En el cas d'un error d'entrada, abans que qualsevol dada es pugui llegir correctament, es retorna l'EOF.

Exemple:

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;> }>

>

>

Sortida

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

Podem escriure String a int?

La resposta és NO . Si utilitzem l'escriptura per convertir la cadena en un número, obtindrem un error tal com es mostra a l'exemple següent.

Exemple:

C




// 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;> }>

>

>

Sortida:

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ó: Com tots dos string i int no es troben a la mateixa jerarquia d'objectes , nosaltres no pot dur a terme una emissió de tipus implícita o explícita com podem fer en cas de conversió doble a int o float a int.

Al codi anterior, podem veure que la sortida dóna l'avís amb qualsevol valor d'escombraries dins. Per tant, per evitar aquestes condicions, utilitzem els mètodes especificats anteriorment.