Konwersja ciągu znaków na int to powtarzające się zadanie w świecie programowania. Pomimo tego, że jest to proste zadanie, wielu programistów albo zawodzi, albo gubi się przy jego wykonywaniu. Konwersja odbywa się głównie po to, abyśmy mogli wykonywać operacje na liczbach przechowywanych jako ciągi znaków.
Przykład:
str=163″
liczba=163
C jest językiem silnie typowanym. Jeśli spróbujemy wprowadzić wartość nieakceptowalną dla tego typu danych, pojawi się błąd. Nie tylko na wejściach, ale podczas wykonywania operacji pojawi się błąd.
Istnieją 3 metody konwersji ciągu znaków na int, które są następujące:
- Używanie atoi() Używanie pętli Używanie sscanf()
1. Konwersja ciągów za pomocą atoi()
Funkcja atoi() w C przyjmuje jako argument tablicę znaków lub literał łańcuchowy i zwraca jej wartość w pliku an liczba całkowita . Jest ona zdefiniowana w plik nagłówkowy.
Jeśli zaobserwujesz holowniczy() nieco bliżej dowiesz się, że oznacza to:

Podział funkcji atoi() w prostych słowach
Przykład:
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;> }> |
>
>Wyjście
kolejka priorytetowa
atoi(141) is 141 atoi(3.14) is 3>
Atoi zachowuje się nieco inaczej w przypadku łańcucha. Sprawdźmy jak:
Przykład:
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;> }> |
>
>Wyjście
0 is of 'Geek 12345' 12345 is of '12345 Geek'>
Wyjaśnienie:
lis kontra wilk
- Geek 12345 tutaj „Geek” jest pierwszym słowem, więc odpowiedź będzie brzmiała: 0 (bez liczby)
- 12345 Geek, tutaj „12345” to pierwsze słowo, więc odpowiedź będzie brzmiała: 12345
2. Korzystanie z pętli
Możemy używać pętli do konwertowania ciągu znaków na liczbę całkowitą, przechodząc kolejno przez każdy element łańcucha i porównując znaki liczbowe z ich wartościami ASCII, aby uzyskać ich wartości liczbowe, a następnie używając matematyki do wygenerowania liczby całkowitej. Poniższy przykład pokazuje, jak to zrobić.
Przykład:
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;> }> |
>
>Wyjście
4213>
Uwaga: Użyliśmy str[i] – 48, aby przekonwertować znak liczby na jego wartość numeryczną. Dla np. Wartość ASCII znaku „5” wynosi 53, więc 53 – 48 = 5, co jest jego wartością liczbową.
3. Korzystanie z funkcji sscanf()
Możemy użyć sscanf(), aby łatwo przekonwertować ciąg na liczbę całkowitą. Ta funkcja odczytuje sformatowane dane wejściowe z ciągu.
Składnia sscanf:
int sscanf (const char * source, const char * formatted_string, ...);>
Parametry :
- źródło – ciąg źródłowy. sformatowany_string – ciąg znaków zawierający specyfikatory formatu . … : – lista argumentów zmiennych zawierająca adresy zmiennych, w których chcemy przechowywać dane wejściowe.
Powinno być co najmniej tyle argumentów, ile jest wartości przechowywanych przez specyfikatory formatu. W przypadku powodzenia funkcja zwraca liczbę wypełnionych zmiennych. W przypadku błędu wejściowego, zanim jakiekolwiek dane mogły zostać pomyślnie odczytane, zwracany jest EOF.
Przykład:
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;> }> |
>
>Wyjście
The value of x : 12345 The value of x : 12345.540039>
Czy możemy wpisać String na int?
Odpowiedź to NIE . Jeśli użyjemy rzutowania typów do konwersji ciągu na liczbę, pojawi się błąd, jak pokazano w przykładzie poniżej.
Przykład:
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;> }> |
>
sortowanie na liście tablic w Javie
>
Wyjście:
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>
Wyjaśnienie: Zarówno jako string i int nie znajdują się w tej samej hierarchii obiektów , My nie można wykonać jawnego lub niejawnego rzutowania typów tak jak możemy to zrobić w przypadku konwersji double na int lub float na int.
W powyższym kodzie widzimy, że dane wyjściowe wyświetlają ostrzeżenie zawierające dowolną wartość śmieciową. Aby więc uniknąć takich warunków, stosujemy metody określone powyżej.