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.