logo

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

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.