Převést řetězec na int v C
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.
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.