Programowanie C

Porównanie stringów Programowanie C

Porównanie stringów Programowanie C
Ciąg znaków w języku C to tablica znaków zakończona znakiem null (\0). Za pomocą tej właściwości porównuje się ciągi znaków.

Dwie struny można porównać na różne sposoby. W tym samouczku najpierw zobaczymy funkcję zdefiniowaną przez użytkownika do porównywania dwóch ciągów, a następnie kilka wbudowanych funkcji bibliotecznych, które mogą być użyte do bardzo łatwego porównania dwóch ciągów. Więc zacznijmy.

Porównanie ciągów znaków za pomocą funkcji zdefiniowanej przez użytkownika :

Napiszemy funkcję stringPorównaj() porównać ciągi. Przechodzimy przez ciągi i porównujemy każdy znak ciągu, aż dojdziemy do końca jednego lub obu lub zostanie znaleziony niezgodny. Jeśli przechodzenie zostanie osiągnięte do końca obu ciągów, ciągi są dopasowywane; w przeciwnym razie ciągi są niedopasowane.

01. /*funkcja zdefiniowana przez użytkownika.do*/
02.
03. #zawierać
04.
05. int stringCompare( char str1[ ], char str2[] ​​)
06.
07. int i=0;
08.
09. while( słowo1[i] == słowo2[i] )
10.
11. if( str1[i] == '\0' || str2[i] == '\0' )
12. złamać;
13. i++;
14.
15.
16. if( str1[i] == '\0' && str2[i] == '\0' )
17. zwróć 0;
18. jeszcze
19. powrót -1;
20.
21.
22.
23.
24. int main()
25.
26. znak łańcuch1[30],znak2[30];
27.
28. printf("Wprowadź pierwszy ciąg: ");
29. scanf("%[^\n]%*c",str1);
30. printf("Wprowadź drugi ciąg: ");
31. scanf("%[^\n]%*c",str2);
32.
33. if(stringCompare(str1,str2) == 0)
34. printf("Łańcuchy są równe \n");
35. jeszcze
36. printf("Ciągi nie są równe \n");
37.
38. zwróć 0; 39.

Tutaj przemierzamy łańcuchy za pomocą pętli while i zmiennej ja. Gdy znaki są równe w tej samej pozycji obu ciągów, wartość ja jest zwiększany o 1 (wiersz 13). Jeśli znaki nie są równe (linia 09) lub dochodzimy do końca ciągu (linia 11), to pętla while jest przerwana. Po pętli while sprawdzamy, czy oba przejścia ciągów zostały osiągnięte do końca, czy nie (wiersz 16). Jeśli przejście zostanie osiągnięte do końca obu ciągów, ciągi są równe, w przeciwnym razie nie.

Porównanie ciągów za pomocą wbudowanych funkcji bibliotecznych:

Do porównywania ciągów można użyć następujących funkcji bibliotecznych:. Wszystkie funkcje są zadeklarowane w strunowy.h plik nagłówkowy.

funkcja strcmp() :

Ta funkcja porównuje dwa ciągi przekazane do funkcji.

Składnia:

int strcmp(const char *str1, const char *str2)

Wartość zwrotu: Zwróć 0, jeśli ciągi są równe. Zwraca ujemną liczbę całkowitą, jeśli wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu jest mniejsza niż drugiego ciągu. Zwróć dodatnią liczbę całkowitą, jeśli wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu jest większa niż drugiego ciągu. Niektóre systemy zwracają różnicę wartości ASCII pierwszego niedopasowanego znaku, a niektóre zwracają -1, jeśli wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu jest mniejsza niż drugiego ciągu i zwracają 1, jeśli wartość ASCII pierwszego niedopasowanego znaku pierwszy ciąg jest większy niż drugi ciąg.

Przykład Wartość zwrotu Wyjaśnienie
strcmp( „Witaj świecie”, „Witaj świecie” ) 0 Dwie struny są takie same.
strcmp( „Witaj”, „Witaj\0 świecie” ) 0 Ciągi są porównywane do znaku '\0'. Pierwszy ciąg domyślnie kończy się na „\0”, a drugi ciąg zawiera znak „\0” po „Hello”.
strcmp( „Witaj\0\0\0”, „Witaj\0 świecie” ) 0 Ciągi są porównywane do znaku '\0'.
strcmp( „Witaj świecie”, „Witaj świecie” ) Ujemna liczba całkowita Wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu ('H') jest mniejsza niż drugiego ciągu ('h')
strcmp(„Witaj świecie”, „Witaj świecie” ) Dodatnia liczba całkowita Wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu ('h') jest większa niż drugiego ciągu ('H')

funkcja strncmp() :

Ta funkcja jest podobna do funkcji strcmp(), ale tutaj musimy określić, ile bajtów jest porównywanych, przekazując dodatkowy argument do funkcji.

Składnia:

int strncmp(const char *str1, const char *str2, size_t n)

Wartość zwrotu: Funkcja zwraca 0 jeśli pierwszy nie znaki dwóch ciągów są równe; w przeciwnym razie zwraca ujemną lub dodatnią liczbę całkowitą w zależności od znaku różnic między wartością ASCII pierwszego niezgodnego znaku.

Przykład Wartość zwrotu Wyjaśnienie
strncmp( „Witaj świecie”, „Witaj świecie”,5 ) 0 Pierwsze 5 znaków jest takich samych.
strncmp( „Witaj”, „Witaj\0 Świecie”,5 ) 0 Pierwsze 5 znaków jest takich samych.
strncmp( „Witaj\0\0\0”, „Witaj\0 świecie”,8 ) 0 '\0' jest po pierwszych 5 znakach w obu ciągach. Zatem porównanie zatrzymuje się po 5, a nie po 8.
strncmp( „Witaj świecie”, „Witaj świecie”,5 ) Ujemna liczba całkowita Wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu ('H') jest mniejsza niż drugiego ciągu ('h')

funkcja strcasecmp() :

Ta funkcja jest podobna do funkcji strcmp(), ale tutaj w ciągach nie jest rozróżniana wielkość liter.

Składnia:

int strcasecmp(const char *str1, const char *str2)

Wartość zwrotu: Taki sam jak strcmp(), ale struny są traktowane jako wielkość liter ma znaczenie.

Przykład Wartość zwrotu Wyjaśnienie
strcasecmp( „Witaj świecie”, „Witaj świecie” ) 0 Dwie struny są takie same.
strcasecmp( „Witaj”, „Witaj\0 świecie” ) 0 Ciągi są porównywane do znaku '\0'. Pierwszy ciąg domyślnie kończy się na „\0”, a drugi ciąg zawiera znak „\0” po „Hello”.
strcasecmp( „Witaj świecie”, „Witaj świecie” ) 0 Ciągi są wielkość liter ma znaczenie. Tak więc „Hello World” i „Hello World” są takie same.

funkcja strncasecmp() :

Ta funkcja jest podobna do funkcji strncmp(), ale tutaj w ciągach nie jest rozróżniana wielkość liter.

Składnia:

int strncasecmp(const char *str1, const char *str2)

Wartość zwrotu: Taki sam jak strncmp(), gdy łańcuchy są traktowane z uwzględnieniem wielkości liter.

Przykład Wartość zwrotu Wyjaśnienie
strncasecmp( „Witaj świecie”, „Witaj świecie”,5 ) 0 Pierwsze 5 znaków jest takich samych.
strncasecmp( „Witaj”, „Witaj\0 Świecie”,5 ) 0 Pierwsze 5 znaków jest takich samych.
strncasecmp( „Witaj\0\0\0”, „Witaj\0 świecie”,8 ) 0 '\0' jest po pierwszych 5 znakach w obu ciągach. Zatem porównanie zatrzymuje się po 5, a nie po 8.
strncasecmp( „Witaj świecie”, „Witaj świecie”,5 ) 0 Ciągi są wielkość liter ma znaczenie. Tak więc „Hello” i „Hello” to to samo.

funkcja memcmp() :

Ta funkcja porównuje dwa bloki pamięci bajt po bajcie. Musimy przekazać dwa wskaźniki bloków pamięci i liczbę bajtów do porównania.

Składnia:

int memcmp(const void *str1, const void *str2, size_t n)

Wartość zwrotu: Funkcja zwraca 0, jeśli dwa bloki pamięci (nie bajty) są równe; w przeciwnym razie zwraca różnice między pierwszą niedopasowaną parą bajtów (bajty są interpretowane jako obiekty typu unsigned char, a następnie promowane do int).

Przykład Wartość zwrotu Wyjaśnienie
memcmp( „Witaj świecie”, „Witaj świecie”,5 ) 0 Pierwsze 5 znaków jest takich samych.
memcmp( „Witaj\0\0\0”, „Witaj\0 świecie”,8 ) Ujemna liczba całkowita Pierwsze 6 znaków jest takich samych, ale siódmy znak jest inny. Tutaj porównanie nie zatrzymało się jak strncmp() po otrzymaniu znaku „\0”.
memcmp( „Witaj świecie”, „Witaj świecie”,11 ) Ujemna liczba całkowita Wartość ASCII pierwszego niedopasowanego znaku pierwszego ciągu ('H') jest mniejsza niż drugiego ciągu ('h')

Przykład:

Poniżej znajduje się przykład kodu C wszystkich omawianych funkcji functions.

01. /*stringPorównaj.do*/
02.
03. #zawierać
04. #zawierać
05.
06. int main()
07.
08. printf("strcmp( "Witaj świecie","Witaj świecie") => %d\n",strcmp( "Witaj świecie","Witaj świecie" ));
09. printf("strcmp( "Witaj","Witaj\\0 Świecie" ) => %d\n",strcmp( "Witaj","Witaj\0 Świecie" ));
10. printf("strcmp( "Witaj świecie","Witaj świecie") => %d\n",strcmp( "Witaj świecie","Witaj świecie" ) );
11. printf("strcmp( "Witaj\\0\\0\\0","Witaj\\0 Świecie" ) => %d\n",strcmp( "Witaj\0\0\0","Witaj\0 Świat" ));
12.
13. printf("\n---------------\n");
14.
15. printf("strncmp( "Witaj świecie","Witaj świecie",5 ) => %d\n",strncmp( "Witaj świecie","Witaj świecie",5));
16. printf("strncmp( "Witaj","Witaj\\0 Świecie",5 ) => %d\n",strncmp( "Witaj","Witaj\0 Świecie",5 ));
17. printf("strncmp( "Witaj\\0\\0\\0","Witaj\\0 Świecie",8 ) => %d\n",strncmp( "Witaj\0\0\0","Witaj \0 Świat",8 ));
18. printf("strncmp( "Witaj świecie","Witaj świecie",5 ) => %d\n",strncmp( "Witaj świecie","Witaj świecie",5));
19.
20. printf("\n---------------\n");
21.
22. printf("strcasecmp( "Witaj świecie","Witaj świecie" ) => %d\n",strcasecmp( "Witaj świecie","Witaj świecie" ));
23. printf("strcasecmp( "Witaj","Witaj\\0 Świecie" ) => %d\n",strcasecmp( "Witaj","Witaj\0 Świecie" ));
24. printf("strcasecmp( "Witaj świecie","Witaj świecie" ) => %d\n",strcasecmp( "Witaj świecie","Witaj świecie" ));
25.
26. printf("\n---------------\n");
27.
28. printf("strncasecmp( "Witaj świecie","Witaj świecie",5 ) => %d\n",strncasecmp( "Witaj świecie","Witaj świecie",5 ) );
29. printf("strncasecmp( "Witaj","Witaj\\0 Świecie",5 ) => %d\n",strncasecmp( "Witaj","Witaj\0 Świecie",5 ));
30. printf("strncasecmp( "Witaj\\0\\0\\0","Witaj\\0 Świecie",8 ) => %d\n",strncasecmp( "Witaj\0\0\0","Witaj \0 Świat",8 ));
31. printf("strncasecmp( "Witaj świecie","Witaj świecie",5 ) => %d\n",strncasecmp( "Witaj świecie","Witaj świecie",5));
32.
33. printf("\n---------------\n");
34.
35. printf("memcmp( "Witaj świecie","Witaj świecie",5 ) => %d\n",memcmp( "Witaj świecie","Witaj świecie",5 ) );
36. printf("memcmp( "Witaj\\0\\0\\0","Witaj\\0 Świecie",8 ) => %d\n",memcmp( "Witaj\0\0\0","Witaj \0 Świat",8 ));
37. printf("memcmp( "Witaj świecie","Witaj świecie",11 ) => %d\n",memcmp( "Witaj świecie","Witaj świecie",11 ));
38.
39. zwróć 0; 40.

Wniosek:

W tym samouczku zobaczyliśmy, jak można porównywać struny na różne sposoby. Jak widzieliśmy, funkcja stringCompare() zwraca -1 dla nierównych ciągów, ale można to zmodyfikować tak, aby zwracała wartość ASCII niezgodnego znaku. Możesz go użyć w swoim kodzie, który najlepiej Ci odpowiada best.

Gry Najlepsze aplikacje do mapowania gamepada dla systemu Linux
Najlepsze aplikacje do mapowania gamepada dla systemu Linux
Jeśli lubisz grać w gry na Linuksie za pomocą gamepada zamiast typowego systemu wprowadzania klawiatury i myszy, jest kilka przydatnych aplikacji dla ...
Gry Przydatne narzędzia dla graczy Linuksa
Przydatne narzędzia dla graczy Linuksa
Jeśli lubisz grać w gry w systemie Linux, prawdopodobnie używałeś aplikacji i narzędzi, takich jak Wine, Lutris i OBS Studio, aby poprawić wrażenia z ...
Gry Zremasterowane gry HD dla Linuksa, które nigdy wcześniej nie zostały wydane na Linuksa
Zremasterowane gry HD dla Linuksa, które nigdy wcześniej nie zostały wydane na Linuksa
Wielu twórców gier i wydawców wymyśla remaster HD starych gier, aby przedłużyć żywotność serii, prosimy fanów o kompatybilność z nowoczesnym sprzętem ...