strcmp() Kullanımı
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 18 / 63.
Dizeleri strcat() ile nasıl birleştireceğinizi öğrendiniz, ancak iki dizenin tam olarak aynı metni içerip içermediğini belirlemeniz gerekirse ne olur? C'de, dizeleri karşılaştırmak için eşittir operatörünü (==) kullanamazsınız çünkü bu operatör gerçek içeriği değil, yalnızca bellek adreslerini karşılaştırır.
<string.h> kütüphanesindeki strcmp() fonksiyonu, iki dizeyi karakter karakter karşılaştırarak bu sorunu çözer. Bu fonksiyon, sözlüksel karşılaştırma (lexicographical comparison) olarak adlandırılan işlemi gerçekleştirir; yani temel olarak dizeleri sözlük sırasına göre karşılaştırır.
#include <stdio.h>
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2); // 0 döndürür (dizeler eşittir)strcmp() fonksiyonu üç farklı türde değer döndürür: dizeler özdeşse 0, ilk dize alfabetik olarak ikinciden önce geliyorsa negatif bir değer ve ilk dize alfabetik olarak ikinciden sonra geliyorsa pozitif bir değer döndürür.
Bu fonksiyon; kullanıcı girişini doğrulamak, metin verilerini sıralamak veya programlarınızda arama işlevselliği uygulamak gibi dize içeriğine dayalı kararlar vermek için gereklidir.
Görev
Kolaystrcmp() fonksiyonunu kullanarak basit bir şifre doğrulama sistemi uygulayan bir C programı yazın. Programınız şunları yapmalıdır:
- İşlenecek giriş denemesi sayısını temsil eden bir
ntam sayısını okuyun - Her giriş denemesi için:
- Girdiden bir kullanıcı adı okuyun
- Girdiden bir şifre okuyun
- Kullanıcı adını "admin" ile karşılaştırmak için
strcmp()kullanın - Şifreyi "secret123" ile karşılaştırmak için
strcmp()kullanın - Karşılaştırma sonuçlarına göre uygun mesajı yazdırın
- Tüm denemeleri işledikten sonra, kaç tane başarılı giriş yapıldığını sayın ve görüntüleyin
Giriş doğrulama mantığı şu şekilde olmalıdır:
- Hem kullanıcı adı hem de şifre doğruysa: "Login successful" yazdırın
- Kullanıcı adı doğru ancak şifre yanlışsa: "Invalid password" yazdırın
- Kullanıcı adı yanlış ancak şifre doğruysa: "Invalid username" yazdırın
- Hem kullanıcı adı hem de şifre yanlışsa: "Invalid credentials" yazdırın
strcmp() fonksiyonunu kullanmak için <string.h> başlık dosyasını eklemeyi unutmayın.
Çıktınız sonuçları aşağıdaki formatta görüntülemelidir:
[Login result message]
[Login result message]
...
Total successful logins: [count]Örneğin, girdi şu şekildeyse:
4
admin
secret123
user
password
admin
wrong
guest
secret123Çıktınız şu şekilde olmalıdır:
Login successful
Invalid credentials
Invalid password
Invalid username
Total successful logins: 1Bu meydan okuma, dizeleri eşitlik için karşılaştırmak üzere strcmp() kullanma, dize karşılaştırma sonuçlarına dayalı koşullu mantık uygulama ve karşılaştırma sonuçlarına göre oluşumları sayma konusundaki anlayışınızı test eder.
Kopya kağıdı
<string.h> kütüphanesindeki strcmp() fonksiyonu, iki dizeyi sözlüksel karşılaştırma kullanarak karakter karakter karşılaştırır:
#include <string.h>
char word1[] = "apple";
char word2[] = "apple";
int result = strcmp(word1, word2);strcmp() şunları döndürür:
- Dizeler özdeşse
0 - İlk dize alfabetik olarak ikinciden önce geliyorsa negatif değer
- İlk dize alfabetik olarak ikinciden sonra geliyorsa pozitif değer
C'de dizeleri karşılaştırmak için == kullanılamaz; çünkü bu operatör içeriği değil, yalnızca bellek adreslerini karşılaştırır.
Kendin dene
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char username[100];
char password[100];
int successful_logins = 0;
// TODO: Kodunuzu buraya yazın
// strcmp() fonksiyonunu kullanarak her giriş denemesini işleyin
// Kullanıcı adını "admin" ve şifreyi "secret123" ile karşılaştırın
// Uygun mesajları yazdırın ve başarılı girişleri sayın
printf("Total successful logins: %d\n", successful_logins);
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları