Převod řetězce na int je ve světě programování opakujícím se úkolem. Navzdory tomu, že jde o jednoduchý úkol, mnoho kodérů při tom buď selže, nebo je zmateno. Převod se většinou provádí tak, že můžeme provádět operace nad čísly, která jsou uložena jako řetězce.
Příklad:
str=163″
číslo = 163
C je silně typovaný jazyk. Pokud se pokusíme zadat hodnotu, která není pro daný datový typ přijatelná, zobrazí se chyba. Nejen ve vstupech, ale při provádění operací dostaneme chybu.
Existují 3 způsoby převodu řetězce na int, které jsou následující:
- Použití atoi() Použití smyček Použití sscanf()
1. Konverze řetězce pomocí atoi()
Funkce atoi() v C bere pole znaků nebo řetězcový literál jako argument a vrací jeho hodnotu v an celé číslo . Je definován v hlavičkový soubor.
Pokud budete pozorovat vlek() trochu blíže zjistíte, že to znamená:

Rozdělení atoi() jednoduše
Příklad:
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;> }> |
>
>Výstup
atoi(141) is 141 atoi(3.14) is 3>
Atoi se pro strunu chová trochu jinak. Podívejme se, jak:
Příklad:
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;> }> |
>
>Výstup
0 is of 'Geek 12345' 12345 is of '12345 Geek'>
Vysvětlení:
- Geek 12345 zde „Geek“ je první slovo, takže odpověď bude: 0 (žádné číslo)
- 12345 Geek zde „12345“ je první slovo, takže odpověď bude: 12345
2. Použití smyček
Můžeme použít smyčky k převodu řetězce na celé číslo tak, že procházíme každý prvek řetězce jeden po druhém a porovnáváme číselné znaky s jejich ASCII hodnotami, abychom získali jejich číselné hodnoty, a pomocí nějaké matematiky pro generování celého čísla. Níže uvedený příklad ukazuje, jak na to.
tisknout vzor hvězdy
Příklad:
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;> }> |
>
>Výstup
4213>
Poznámka: Pro převod číselného znaku na jejich číselné hodnoty jsme použili str[i] – 48. Pro např. Hodnota ASCII znaku „5“ je 53, tedy 53 – 48 = 5, což je jeho číselná hodnota.
3. Použití sscanf()
Ke snadnému převodu řetězce na celé číslo můžeme použít sscanf(). Tato funkce čte formátovaný vstup z řetězce.
Syntaxe sscanf:
int sscanf (const char * source, const char * formatted_string, ...);>
Parametry :
- source – zdrojový řetězec. formatted_string – řetězec, který obsahuje specifikátory formátu . … : – seznam argumentů proměnných, který obsahuje adresy proměnných, do kterých chceme uložit vstupní data.
Těchto argumentů by mělo být alespoň tolik, kolik je hodnot uložených ve specifikátorech formátu. V případě úspěchu funkce vrátí počet vyplněných proměnných. V případě selhání vstupu, než bylo možné úspěšně přečíst jakákoli data, se vrátí EOF.
Příklad:
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;> }> |
>
>Výstup
The value of x : 12345 The value of x : 12345.540039>
Můžeme přetypovat řetězec na int?
Odpověď je NE . Pokud použijeme přetypování k převodu řetězce na číslo, dostaneme chybu, jak je ukázáno v příkladu níže.
Příklad:
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;> }> |
>
>
Výstup:
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>
Vysvětlení: Jako obojí string a int nejsou ve stejné hierarchii objektů , my nemůže provádět implicitní nebo explicitní přetypování jak to můžeme udělat v případě převodu double na int nebo float na int.
Ve výše uvedeném kódu vidíme, že výstup dává varování s jakoukoli hodnotou odpadu uvnitř. Abychom se těmto podmínkám vyhnuli, používáme výše uvedené metody.