İki dize çeşitli şekillerde karşılaştırılabilir. Bu öğreticide, önce iki diziyi karşılaştırmak için kullanıcı tanımlı bir fonksiyon göreceğiz ve ardından iki diziyi çok kolay bir şekilde karşılaştırmak için kullanılabilecek bazı yerleşik kütüphane fonksiyonlarını göreceğiz. Öyleyse başlayalım.
Kullanıcı tanımlı bir işlev kullanarak dize karşılaştırması:
bir fonksiyon yazacağız dizeKarşılaştır() dizeleri karşılaştırmak için. Dizeleri dolaşıyoruz ve herhangi birinin sonuna ulaşana kadar dizenin her karakterini karşılaştırıyoruz ya da her ikisi ya da bir uyumsuzluk bulunana kadar. Geçişe her iki dizenin sonuna ulaşılırsa, dizeler eşleştirilir; aksi takdirde, dizeler eşleşmez.
01. /*userDefinedFunction.c*/02.
03. #Dahil etmek
04.
05. int stringCompare( char str1[ ], char str2[ ] )
06.
07. int i=0;
08.
09. while( str1[i] == str2[i] )
10.
11. if( str1[i] == '\0' || str2[i] == '\0' )
12. kırmak;
13. ben++;
14.
15.
16. if( str1[i] == '\0' && str2[i] == '\0' )
17. 0 döndür;
18. Başka
19. dönüş -1;
20.
21.
22.
23.
24. int ana()
25.
26. karakter str1[30],str2[30];
27.
28. printf("İlk diziyi giriniz: ");
29. scanf("%[^\n]%*c",str1);
30. printf("İkinci diziyi giriniz: ");
31. scanf("%[^\n]%*c",str2);
32.
33. if(stringCompare(str1,str2) == 0)
34. printf("Dizeler eşittir\n");
35. Başka
36. printf("Dizeler eşit değil\n");
37.
38. 0 döndür; 39.
Burada while döngüsü ve bir değişken kullanarak dizeleri geçiyoruz ben. Her iki dizenin aynı konumunda karakterler eşit olduğunda, değeri ben 1 artırılır (satır 13). Karakterler eşit değilse (satır 09) veya dizenin sonuna (satır 11) ulaşırsak, while döngüsü bir aradır. while döngüsünden sonra, her iki string geçişinin de sona ulaşıp ulaşmadığını kontrol ediyoruz (16. satır). Geçiş her iki dizenin sonuna kadar ulaşılırsa, dizeler eşittir, aksi takdirde olmaz.
Yerleşik kitaplık işlevlerini kullanarak dize karşılaştırması:
Dizi karşılaştırması için aşağıdaki kitaplık işlevleri kullanılabilir. Tüm işlevler, dize.h başlık dosyası.
strcmp() işlevi:
Bu işlev, işleve iletilen iki dizeyi karşılaştırır.
Sözdizimi:
int strcmp(const char *str1, const char *str2)Geri dönüş değeri: Dizeler eşitse 0 döndür. İlk dizenin eşleşmeyen ilk karakterinin ASCII değeri ikinci dizeden küçükse negatif bir tamsayı döndür. İlk dizenin eşleşmeyen ilk karakterinin ASCII değeri ikinci dizeden büyükse pozitif bir tamsayı döndür. Bazı sistemler, ilk eşleşmeyen karakterin ASCII değerinin farkını döndürür ve bazı sistemler, ilk eşleşmeyen ilk karakterin ASCII değeri ikinci dizeden küçükse -1, eşleşmeyen ilk karakterin ASCII değeri ise 1 döndürür. ilk dize ikinci dizeden daha büyük.
Misal | Geri dönüş değeri | açıklama |
strcmp( “Merhaba Dünya”, “Merhaba Dünya” ) | 0 | İki dizi aynı. |
strcmp( “Merhaba”,”Merhaba\0 Dünya” ) | 0 | Dizeler '\0' karakterine kadar karşılaştırılır. İlk dize varsayılan olarak '\0' ile biter ve ikinci dize 'Merhaba'dan sonra '\0' karakterini içerir. |
strcmp( “Merhaba\0\0\0",”Merhaba\0 Dünya” ) | 0 | Dizeler '\0' karakterine kadar karşılaştırılır. |
strcmp( "Merhaba Dünya", "Merhaba Dünya" ) | negatif tam sayı | İlk dizenin ('H') ilk eşleşmeyen karakterinin ASCII değeri, ikinci dizeden ('h') küçük |
strcmp(“Merhaba Dünya”, “Merhaba Dünya” ) | Pozitif tamsayı | İlk dizenin ('h') ilk eşleşmeyen karakterinin ASCII değeri, ikinci dizeden ('H') büyük |
strncmp() işlevi:
Bu işlev, işleve benzer strcmp(), ama burada fonksiyona fazladan bir argüman ileterek kaç baytın karşılaştırılacağını belirtmeliyiz.
Sözdizimi:
int strncmp(const char *str1, const char *str2, size_t n)Geri dönüş değeri: işlev döner 0 eğer ilk n iki dizenin karakterleri eşittir; aksi takdirde, ilk eşleşmeyen karakterin ASCII değeri arasındaki farkların işaretine bağlı olarak negatif veya pozitif tamsayı döndürür.
Misal | Geri dönüş değeri | açıklama |
strncmp( “Merhaba Dünya”,”Merhaba Dünya”,5 ) | 0 | İlk 5 karakter aynı. |
strncmp( “Merhaba”,”Merhaba\0 Dünya”,5 ) | 0 | İlk 5 karakter aynı. |
strncmp( “Merhaba\0\0\0",”Merhaba\0 Dünya”,8 ) | 0 | '\0' her iki dizedeki ilk 5 karakterden sonra. Yani, karşılaştırma 8 değil 5'ten sonra durdurulur. |
strncmp( “Merhaba Dünya”,”merhaba Dünya”,5 ) | negatif tam sayı | İlk dizenin ('H') ilk eşleşmeyen karakterinin ASCII değeri, ikinci dizeden ('h') küçük |
strcasecmp() işlevi:
Bu işlev, işleve benzer strcmp(), ama burada dizeler büyük/küçük harfe duyarlı değildir.
Sözdizimi:
int strcasecmp(const char *str1, const char *str2)Geri dönüş değeri: İle aynı strcmp(), ancak dizeler olarak kabul edilir büyük/küçük harfe duyarlı.
Misal | Geri dönüş değeri | açıklama |
strcasecmp( “Merhaba Dünya”, “Merhaba Dünya” ) | 0 | İki dizi aynı. |
strcasecmp( “Merhaba”,”Merhaba\0 Dünya” ) | 0 | Dizeler '\0' karakterine kadar karşılaştırılır. İlk dize varsayılan olarak '\0' ile biter ve ikinci dize 'Merhaba'dan sonra '\0' karakterini içerir. |
strcasecmp( "Merhaba Dünya", "Merhaba Dünya" ) | 0 | Dizeler büyük/küçük harfe duyarlı. Yani, “Merhaba Dünya” ve “merhaba Dünya” aynı. |
strncasecmp() işlevi:
Bu işlev, işleve benzer strncmp(), ama burada dizeler büyük/küçük harfe duyarlı değildir.
Sözdizimi:
int strncasecmp(const char *str1, const char *str2)Geri dönüş değeri: İle aynı strncmp(), dizeler büyük/küçük harfe duyarlı olarak ele alındığında.
Misal | Geri dönüş değeri | açıklama |
strncasecmp( “Merhaba Dünya”,”Merhaba Dünya”,5 ) | 0 | İlk 5 karakter aynı. |
strncasecmp( “Merhaba”,”Merhaba\0 Dünya”,5 ) | 0 | İlk 5 karakter aynı. |
strncasecmp( “Merhaba\0\0\0",”Merhaba\0 Dünya”,8 ) | 0 | '\0' her iki dizedeki ilk 5 karakterden sonra. Yani, karşılaştırma 8 değil 5'ten sonra durdurulur. |
strncasecmp( “Merhaba Dünya”,”merhaba Dünya”,5 ) | 0 | Dizeler büyük/küçük harfe duyarlı. Yani, “Merhaba” ve “merhaba” aynı. |
memcmp() işlevi:
Bu işlev iki bellek bloğunu bayt bayt karşılaştırır. Hafıza bloklarının iki işaretçisini ve karşılaştırılacak bayt sayısını geçmeliyiz.
Sözdizimi:
int memcmp(const void *str1, const void *str2, size_t n)Geri dönüş değeri: İki bellek bloğu (n bayt) eşittir; aksi takdirde, eşleşmeyen ilk bayt çifti arasındaki farkları döndürür (baytlar, işaretsiz karakter nesneleri olarak yorumlanır, ardından int'ye yükseltilir).
Misal | Geri dönüş değeri | açıklama |
memcmp( “Merhaba Dünya”,”Merhaba Dünya”,5 ) | 0 | İlk 5 karakter aynı. |
memcmp( “Merhaba\0\0\0",”Merhaba\0 Dünya”,8 ) | negatif tam sayı | İlk 6 karakter aynı, ancak 7. karakter farklı. Burada karşılaştırma durdurulmadı strncmp() '\0' karakteri alınırken. |
memcmp( “Merhaba Dünya”,”merhaba Dünya”,11 ) | negatif tam sayı | İlk dizenin ('H') ilk eşleşmeyen karakterinin ASCII değeri, ikinci dizeden ('h') küçük |
Misal:
Aşağıda tartışılan tüm işlevlerin C kodu örneği verilmiştir.
01. /*stringKarşılaştır.c*/02.
03. #Dahil etmek
04. #Dahil etmek
05.
06. int ana()
07.
08. printf("strcmp( "Merhaba Dünya", "Merhaba Dünya" ) => %d\n",strcmp( "Merhaba Dünya", "Merhaba Dünya" ));
09. printf("strcmp( "Merhaba","Merhaba\\0 Dünya") => %d\n",strcmp( "Merhaba","Merhaba\0 Dünya" ));
10. printf("strcmp( "Merhaba Dünya", "merhaba Dünya" ) => %d\n",strcmp( "Merhaba Dünya", "merhaba Dünya" ) );
11. printf("strcmp( "Merhaba\\0\0\\0","Merhaba\\0 Dünya") => %d\n",strcmp( "Merhaba\0\0\0","Merhaba\0 Dünya" ));
12.
13. printf("\n ---------------\n");
14.
15. printf("strncmp("Merhaba Dünya","Merhaba Dünya",5 ) => %d\n",strncmp( "Merhaba Dünya","Merhaba Dünya",5 ));
16. printf("strncmp( "Merhaba","Merhaba\\0 Dünya",5 ) => %d\n",strncmp( "Merhaba","Merhaba\0 Dünya",5 ));
17. printf("strncmp( "Merhaba\\0\\0\\0","Merhaba\\0 Dünya",8 ) => %d\n",strncmp( "Merhaba\0\0\0","Merhaba \0 Dünya",8 ));
18. printf("strncmp("Merhaba Dünya","merhaba Dünya",5 ) => %d\n",strncmp( "Merhaba Dünya","merhaba Dünya",5 ));
19.
20. printf("\n ---------------\n");
21.
22. printf("strcasecmp("Merhaba Dünya","Merhaba Dünya") => %d\n",strcasecmp( "Merhaba Dünya","Merhaba Dünya" ));
23. printf("strcasecmp( "Merhaba","Merhaba\\0 Dünya") => %d\n",strcasecmp( "Merhaba","Merhaba\0 Dünya" ));
24. printf("strcasecmp("Merhaba Dünya","merhaba Dünya") => %d\n",strcasecmp("Merhaba Dünya","merhaba Dünya" ));
25.
26. printf("\n ---------------\n");
27.
28. printf("strncasecmp( "Merhaba Dünya","Merhaba Dünya",5 ) => %d\n",strncasecmp( "Merhaba Dünya","Merhaba Dünya",5 ) );
29. printf("strncasecmp( "Merhaba","Merhaba\\0 Dünya",5 ) => %d\n",strncasecmp( "Merhaba","Merhaba\0 Dünya",5 ));
30. printf("strncasecmp( "Merhaba\\0\\0\\0","Merhaba\\0 Dünya",8 ) => %d\n",strncasecmp( "Merhaba\0\0\0","Merhaba \0 Dünya",8 ));
31. printf("strncasecmp("Merhaba Dünya","merhaba Dünya",5 ) => %d\n",strncasecmp( "Merhaba Dünya","merhaba Dünya",5 ));
32.
33. printf("\n ---------------\n");
34.
35. printf("memcmp( "Merhaba Dünya","Merhaba Dünya",5 ) => %d\n",memcmp( "Merhaba Dünya","Merhaba Dünya",5 ) );
36. printf("memcmp( "Merhaba\\0\0\\0","Merhaba\\0 Dünya",8 ) => %d\n",memcmp( "Merhaba\0\0\0","Merhaba \0 Dünya",8 ));
37. printf("memcmp("Merhaba Dünya","merhaba Dünya",11 ) => %d\n",memcmp( "Merhaba Dünya","merhaba Dünya",11 ));
38.
39. 0 döndür; 40.
Sonuç:
Bu derste, dizilerin çeşitli şekillerde nasıl karşılaştırılabileceğini gördük. Gördüğümüz gibi, stringCompare() işlevi, eşit olmayan dizeler için -1 döndürür, ancak bu, uyumsuz karakterin ASCII değerini döndürecek şekilde değiştirilebilir. Sizin için en uygun olanı kodunuzda kullanabilirsiniz.