Porównanie ciągów znaków: programowanie w C

String Comparison C Programming



Ciąg znaków w języku C to tablica znaków, która jest zakończona znakiem null (). Za pomocą tej właściwości są porównywane 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() do porównania ciągów. Przechodzimy przez ciągi i porównujemy każdy znak ciągu, aż dotrzemy do końca jednego lub obu lub jednego niedopasowanego. 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.c*/
02.
03.#włączać
04.
05.intstringPorównaj( zwęglaćstr1[ ], zwęglaćstr2[ ] )
06.{
07.inti=0;
08.
09. podczas(str1[i] ==str2[i] )
10.
piętnaście.
16.Jeśli(str1[i] == ' 0' &&str2[i] == ' 0' )
17.powrót 0;
18.w przeciwnym razie
19.powrót -1;
20.
dwadzieścia jeden.}
22.
2. 3.
24.intGłówny()
25.{
26.zwęglaćstr1[30],str2[30];
27.
28. printf ('Wprowadź pierwszy ciąg: ');
29. scanf ('% [^ ]% * C ',str1);
30. printf ('Wprowadź drugi ciąg: ');
31. scanf ('% [^ ]% * C ',str2);
32.
33.Jeśli(stringPorównaj(str1,str2) == 0)
3. 4. printf („Struny są równe” ');
35.w przeciwnym razie
36. printf („Struny nie są równe” ');
37.
38.powrót 0; 39.}





Tutaj przemierzamy łańcuchy za pomocą pętli while i zmiennej i . Gdy znaki są równe w tej samej pozycji obu ciągów, wartość i 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 przerwaniem. Po pętli while sprawdzamy, czy obydwa przejścia ciągów zostały osiągnięte do końca, czy nie (linia 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 string.h plik nagłówkowy.



funkcja strcmp() :

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

Składnia :

int strcmp (stały zwęglać *str1, stały zwęglać *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ż wartość 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 Świecie ) 0 Ciągi są porównywane do znaku „”. Pierwszy ciąg domyślnie kończy się na „”, a drugi ciąg zawiera znak „” po „Hello”.
strcmp( Witaj 0 0 0 ″, Witaj 0 świecie ) 0 Ciągi są porównywane do znaku „”.
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 do funkcji dodatkowy argument.

Składnia:

int strncmp (stały zwęglać *str1, stały zwęglać *str2, rozmiar_tn)

Wartość zwrotu: Funkcja zwraca 0 jeśli pierwszy n 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 „” znajduje się 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:

intstrcasecmp(stały zwęglać *str1, stały zwęglać *str2)

Wartość zwrotu: Taki sam jak strcmp() , ale ciągi 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 Świecie ) 0 Ciągi są porównywane do znaku „”. Pierwszy ciąg domyślnie kończy się na „”, a drugi ciąg zawiera znak „” 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:

intstrncasecmp(stały zwęglać *str1, stały zwęglać *str2)

Wartość zwrotu: Taki sam jak strncmp() , gdy ciągi 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 „” znajduje się 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. Więc cześć i cześć są takie same.

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 (stały próżnia *str1, stały próżnia *str2, rozmiar_tn)

Wartość zwrotu: Funkcja zwraca 0, jeśli dwa bloki pamięci ( n 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 „”.
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.

01./*stringCompare.c*/
02.
03.#włączać
04.#włączać
05.
06.intGłówny()
07.{
08. printf ('strcmp( 'Witaj świecie','Witaj świecie' ) => %d ', strcmp ( 'Witaj świecie','Witaj świecie' ));
09. printf ('strcmp( 'dzień dobry','Dzień dobry\0Świat' ) => %d ', strcmp ( 'Dzień dobry','Dzień dobry 0Świat' ));
10. printf ('strcmp( 'Witaj świecie','Witaj świecie' ) => %d ', strcmp ( 'Witaj świecie','Witaj świecie' ) );
jedenaście. printf ('strcmp( 'Dzień dobry\0\0\0','Dzień dobry\0Świat' ) => %d ', strcmp ( 'Dzień dobry 0 0 0','Dzień dobry 0Świat' ));
12.
13. printf (' --------------- ');
14.
piętnaście. printf ('strncmp( 'Witaj świecie','Witaj świecie',5 ) => %d ', strncmp ( 'Witaj świecie','Witaj świecie',5 ));
16. printf ('strncmp( 'dzień dobry','Dzień dobry\0Świat',5 ) => %d ', strncmp ( 'Dzień dobry','Dzień dobry 0Świat',5 ));
17. printf ('strncmp( 'Dzień dobry\0\0\0','Dzień dobry\0Świat',8 ) => %d ', strncmp ( 'Dzień dobry 0 0 0','Dzień dobry 0Świat',8 ));
18. printf ('strncmp( 'Witaj świecie','Witaj świecie',5 ) => %d ', strncmp ( 'Witaj świecie','Witaj świecie',5 ));
19.
20. printf (' --------------- ');
dwadzieścia jeden.
22. printf ('strcasecmp( 'Witaj świecie','Witaj świecie' ) => %d ',strcasecmp( 'Witaj świecie','Witaj świecie' ));
2. 3. printf ('strcasecmp( 'dzień dobry','Dzień dobry\0Świat' ) => %d ',strcasecmp( 'Dzień dobry','Dzień dobry 0Świat' ));
24. printf ('strcasecmp( 'Witaj świecie','Witaj świecie' ) => %d ',strcasecmp( 'Witaj świecie','Witaj świecie' ));
25.
26. printf (' --------------- ');
27.
28. printf ('strncasecmp( 'Witaj świecie','Witaj świecie',5 ) => %d ',strncasecmp( 'Witaj świecie','Witaj świecie',5 ) );
29. printf ('strncasecmp( 'dzień dobry','Dzień dobry\0Świat',5 ) => %d ',strncasecmp( 'Dzień dobry','Dzień dobry 0Świat',5 ));
30. printf ('strncasecmp( 'Dzień dobry\0\0\0','Dzień dobry\0Świat',8 ) => %d ',strncasecmp( 'Dzień dobry 0 0 0','Dzień dobry 0Świat',8 ));
31. printf ('strncasecmp( 'Witaj świecie','Witaj świecie',5 ) => %d ',strncasecmp( 'Witaj świecie','Witaj świecie',5 ));
32.
33. printf (' --------------- ');
3. 4.
35. printf ('memcmp( 'Witaj świecie','Witaj świecie',5 ) => %d ', memcmp ( 'Witaj świecie','Witaj świecie',5 ) );
36. printf ('memcmp( 'Dzień dobry\0\0\0','Dzień dobry\0Świat',8 ) => %d ', memcmp ( 'Dzień dobry 0 0 0','Dzień dobry 0Świat',8 ));
37. printf ('memcmp( 'Witaj świecie','Witaj świecie',11 ) => %d ', memcmp ( 'Witaj świecie','Witaj świecie',jedenaście ));
38.
39.powrót 0; 40.}

Wniosek:

W tym samouczku zobaczyliśmy, jak można porównywać struny na różne sposoby. Jak widzieliśmy, funkcja stringCompare() zwraca wartość -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.