Merhaba, tekrar hoş geldiniz. Karakter dizilerini anlamakla
ilgili olan bir önceki zorluğumuza bir çözüm sunmak istiyorum.
Temel olarak, bir dizenin uzunluğunu almak için fonksiyonlar, bir dizeyi birleştirmek
için fonksiyon ve iki dizenin eşit olup olmadığını kontrol etmek için
bir fonksiyon yazacağız.
Bu yüzden bir proje oluşturacağım. Buna sadece karakter dizilerini
anlama adını vereceğim.
Ve yapacağımız ilk şey bu uzunluk fonksiyonunu uygulamak olacak.
En üstte üç fonksiyon bildirimi
oluşturacağız.
İlkine dize uzunluğu adını vereceğiz.
İsimlendirme için camel case kullanacağız.
Bu sadece sabit bir karakter dizisi alacaktır.
Peki bunun bir karakter dizisi olduğunu nereden biliyoruz ve
sonra noktalı virgül koyacağız. Bu yaratılacak ilk şey olacak, bu yüzden şimdilik
burada duracağız.
Ve bu fonksiyonu oluşturacağız,
aşağıda tanımlayacağız,
böylece bu güzel const anahtar kelimesini anlamalısınız.
Const, değişemeyen, değiştirilemeyen bir karakter dizisi olduğu anlamına gelir.
Burada const kullanmamızın nedeni, fonksiyon içinde
dizeyi değiştirmek istemememiz, sadece temel olarak ayrıştırmak
ve ardından uzunluğu döndürmek, bir tamsayı döndürmek istememizdir.
Bu fonksiyonu uygulamak aslında oldukça kolaydır çünkü sadece bir dizi üzerinden gidiyoruz.
Yani aslında sayım sıfıra eşittir
diyebiliriz. Bu yerel bir değişkendir.
Yalnızca bu işlevin içinde kullanılabilir.
Şimdi kendinize neden size of operatörünü kullanamadığımızı sorabilirsiniz
çünkü size of operatörü bize dizenin boyutunu söyleyecektir, bu dizenin içinde
kaç karakter olduğunu söylemeyecektir.
Ancak tek yapmamız gereken bir döngü oluşturmak ve
null sonlandırıcıya ulaşana kadar dizinin içinden geçmek.
Böylece dizgimize bakabiliriz. Vay be dize sayısı boş
sonlandırıcıya eşit değil diyebiliriz, boş sonlandırıcı
ters eğik çizgi sıfır olarak tek bir karakter içinde
temsil edilir.
Karakterlerle karşılaştırma yaptığımız için eşit değil operatörünü kullanabiliriz.
Ve bu while deyiminin gövdesinde sadece bir şey var artı artı sayım,
sadece sayımı artırıyor.
Ve sonra onu geri döndürmek istiyoruz, sadece return count diyoruz ve hepsi bu.
Tüm dize uzunluğu işlevi budur. Bu oldukça kolaydır çünkü karakter
dizisi bir dizinin içindedir ve dizi
null sonlandırıcı ile biter.
Bunu test etmek için gidip ana metodumuzu
başlatabilir ve bazı sabit karakterler
oluşturabiliriz, sadece
bir Jason kelimesi diyelim.
İşte c'de bir karakter dizisi bu şekilde oluşturulur.
Sabitin orada olması gerekmiyor, ancak bu değiştirilmiyor.
char anahtar sözcüğünü, char veri türünü, tanımlayıcıyı ve ardından parantezleri kullanın.
Parantezlerin içinde boyutu belirtmemek daha iyidir çünkü c derleyicisi
otomatik olarak bir null sonlandırıcı ekleyecektir.
Ve atama operatöründen hemen
sonra, çift tırnak içine string literalinizi koyarsınız.
Çalıştığından emin olmak için burada bir çift oluşturacağız.
Karakter dizilerini çok kolay bir şekilde görüntüleyebiliriz çünkü sadece yüzde
s sembolünü kullanabiliriz, ancak burada asıl görüntülemek istediğimiz şey
uzunluklardır. Bu yüzden yüzde d'yi
kullanacağız.
Bu yüzden bu üç dizenin bağlantılarını yazdıracağız,
yüzde d ve aralarında biraz boşluk bırakacağız ve sonra bir satır beslemesi
ekleyeceğiz.
Ve bu sadece her kelime için dize uzunluğu fonksiyonunu
çağıracak, burada
oldukça basit ve hepsi bu. Şimdi inşa edip test edebilir ve bunun gerçekten çalışıp çalışmadığını görebiliriz.
Çıktı olarak görmemiz gereken şey, 5 olan Jason'ın
uzunluğunu, 2 olan okay'ın uzunluğunu ve yaklaşık 8 gibi görünen
her şeyin uzunluğunu görmeliyiz.
Yani burada 5, 2 ve 8 var, ki bu doğru görünüyor.
Böylece bir dize uzunluğunu bu şekilde yazabilirsiniz. Birleştirme işlevine geçelim.
Birleştirme işlevi
sadece üç dizgi ve iki sabit alacaktır.
Ve bu hiçbir şeyi geri getirmeyecek. Elde edilen dizeyi sadece
ilk parametreye koyacaktır.
Bu yüzden buna concat diyeceğiz. Bir sonucumuz olacak ve
iki dizemiz olacak, biri iki dizeyi
birleştirmek istediğimiz diğeri ise sadece tek bir dizeye sahip
olmak istediğimiz. Dize bir ve dize ikiye isim vereceğiz.
Ve işte başlıyoruz. Ve bu bizim fonksiyon bildirimimiz.
Böylece tanımlanmadan önce herhangi bir yerde kullanabiliriz.
Bunun da diziden geçmesi gerekecek. Sadece iki diziden geçmesi gerekecek ve her
birinden geçerken ortaya çıkan dizeye ekleme yapacağız.
Sadece bu fonksiyon içinde kullanabileceğimiz birkaç yerel değişken oluşturacağız,
int I ve j.
Ve sonra dizinin içinden geçmek için bir
for döngüsü kullanacağız. I için 0'a eşit diyeceğiz.
Str sub 1 veya sub I boş sonlandırıcıya
eşit değildir ve sonra
da I'yı artırır.
Döngü tanımlayıcısının ilk şey
olduğu for döngüsü sözdizimimize aşinayız.
İlk noktalı virgülden önce, ikinci noktalı virgülden önce atladığımız koşul
ve ardından sonsuz bir döngüye sahip
olmadığımızdan emin olmak için döngü kontrol değişkenini değiştirmek.
Burada yaptığımız tek şey sonuçları kaydetmektir,
alt I eşittir str bir alt I.
Unutmayın, bunlar karakterlerdir, bu nedenle burada eşittir atamasını kullanmanızda bir sakınca yoktur.
Bunu karakter dizilerinde
yapamayız çünkü karakter dizilerinde bir diziye dizi atayamazsınız.
Bir str kopyası kullanmamız gerekecek.
Yani ilk dizeyi kopyalıyor.
Ve şimdi ikinci dizeyi sonuçlarla birleştirmek
istiyoruz, bu yüzden çok çok benzer bir şey yapacağız, ancak ikinci
diziye bakacağız ve sonuçta doğru noktaya koyduğumuzdan emin olacağız.
Yani şöyle bir şey yapabiliriz. j'den sıfıra gideriz,
str to j boş sonlandırıcı ++j'ye eşit değildir.
Ve sonucun sadece I artı j olduğunu göreceksiniz, yani ne ile bittiysem.
On karakter eklersem, sıfır tabanlı olduğu
için artık onuncu karakterden başlayacak ve ona sadece j ekleyecektir,
yani 10 artı 0, 10 artı 1 ve bu şekilde devam edecektir.
İşte bu kadar.
Yapmanız gereken ve gerçekten önemli olan son bir şey de null sonlandırıcıyı eklemeniz gerektiğidir.
Yani sonuç, I artı j demek ve ardından tek bir karakter
eklemek istiyoruz, null terminator, yani
tek tırnak içinde ters eğik çizgi sıfır.
Bizim görevimiz de budur.
Bu fonksiyondan herhangi bir şey döndürmemiz
gerekmiyor çünkü sadece str 1'i str 2'ye kopyalıyoruz.
Şimdi bunu test edelim.
Bu konuda yapabilmeyi beklediğim şey, birkaç karakterle test etmektir.
Elimizdeki mevcut karakterleri kullanacağız ve sadece birkaç
tanesini birleştireceğiz.
Bu yüzden başka bir sonuç oluşturmamız
gerekiyor. Bu yüzden sadece netleştirmek
için sonuç diyeceğiz.
Burada, ilki için bir boyut belirtmemiz
gerektiğini söyleyeceğiz.
Bu yüzden sadece 50'lik bir boyut belirleyeceğiz. Bunu sınırlayacağız.
Yani bu sabit karakterler çalışmalıdır.
Şimdi sadece printf diyeceğiz,
bir dize yazdıracağız.
Bu yüzden yüzde s diyeceğiz ve sonra concat diyeceğiz, ki
bu bizim adlandırdığımız şey. Sonuçları ve ardından birinci
ve ikinci kelimeyi aktaracağız.
Bunun çıktı olarak görüntülenmesi gerekir
ve bunu birkaç yeni satıra koyduğumuzdan emin olacağız.
Bu, Jason okay çıktısı olarak görüntülenmelidir. Yani concat aslında herhangi bir veri döndürmüyor,
bu yüzden doğrudan printf'e koyamıyorum.
Yapmam gereken şey onu çağırmak ve ardından sonucu görüntülemek.
Bu yüzden concat diyoruz.
Her şey sonuca eklenir ve sonucu görüntüleriz.
Bunu tekrar çalıştırdığımızda, Jason'ın tamam
olduğunu görmeliyiz ve görüyoruz.
Uygulamak istediğimiz üçüncü
işlev, iki dizenin eşit olup olmadığını kontrol eden bir karşılaştırma işlevidir.
Bu fonksiyon bir boolean döndürmelidir.
Bu yüzden standart bool'umuzu dahil etmek istiyoruz.
Böylece boolean ve true ve false değerlerini kullanabiliriz.
Ve bu aslında eşit dizeler olarak tanımlanacaktır.
Bu, sabit bir karakter dizisi, s1 ve iki dizenin eşit olup olmadığını
kontrol etmek için başka bir karakter
dizisi alacaktır.
Doğru başlığı eklediğimden emin olmak için bunu oluşturmayı deneyeceğim
ve sanırım yaptım çünkü artık bool anahtar sözcüğünü kullanabiliyorum
çünkü bunu ekledim ve ayrıca true false kullanabiliyorum.
Öyleyse bu eşit dizeleri uygulayalım.
Bu, dizinin içinden geçip her bir karakteri
kontrol etmekle hemen hemen aynı olacaktır.
Bu yüzden, 0 ile başlatılmış
döngümüz için 0'a eşit bir çift yerel değişken oluşturacağız.
Bir boolean'da, bu bize sadece eşit olup
olmadıklarını söyler çünkü döndüreceğimiz şey budur, is equals gibi bir şey. Ve bunu aslında false olarak başlatabiliriz.
Aslında ilk yapmak istediğimiz şey sayımı almak.
Her ikisinin de ne kadar büyük olduğunu görmek
istiyoruz. Böylece bir while döngüsüne sahip olabiliriz
çünkü temelde sadece null sonlandırmayı kontrol etmek için
boyuta bakmak amacıyla sayıya ihtiyacımız
vardır.
Bu yüzden ilettiğimiz dizelerin aynı boyutta olduğunu varsayacağız.
Böylece basit bir while döngüsü yazabiliriz. Eğer ifadelerini de yazabilirsiniz.
Her şeyi bir while döngüsüne dahil ettim,
mantıksal operatörleri kullanarak karşılaştırmalarımı yaptım.
Mantıksal operatörleri kullanmak zorunda değilsiniz. Bir if deyimi kullanabilir ve sadece ikinci bir dizenin tamamını
gözden geçirebilirsiniz.
Ancak burada yaptığım şey, s1 alt I'nın s2
alt I'ya eşit olduğunu ve boş sonlandırıcılara
eşit olmadıklarını söyledim.
Çünkü null sonlandırıcılara eşitlerse,
herhangi biri null sonlandırıcı ise atlamak isteriz.
Yani şimdi artı artı ben diyoruz. Yapmamız gereken son şey ise bunların null sonlandırıcı
olup olmadığını kontrol etmektir. Ve eğer öyleyse, boolean değişkeninizi doğru veriyi
döndürecek şekilde ayarlayabilirsiniz.
Yani burada s1 sub I bir null terminatöre eşitse
ve s2 sub null terminatöre eşitse, boolean
değişkenimizi equals olarak ayarlayabiliriz ve
sonra bunu döndürmek isteriz.
Ve sonra sadece geri dönüşün eşit olduğunu söyleyin.
Bunu test etmek için iyi ve kötü bir dizeyi test etmemiz gerekecek.
Öyleyse devam edelim ve eşit dizeler diyelim.
Sadece boolean'ın tamsayı değerini yazdıracağım,
yani yüzde d ve burada dizelere eşit diyeceğiz, bu bir şey döndürür, böylece
bunu eşittir dizesi yazdırma
ifadesine koyabiliriz. Sadece dizelerin eşit olduğundan
emin olmak istiyorum
ve sonra Jason virgül Jason'ı geçeceğiz.
Ve bu sefer Jason'ın
diyeceğiz.
Ve ilki bir, ikincisi sıfır döndürmelidir,
bir doğruyu, sıfır yanlışı temsil eder.
Bunu çalıştırdığımızda, bir ve sıfır
görürüz. Doğru için bir ve yanlış için sıfır, ancak
satır beslememiz olmadığı için okuması zor. Şimdi bir satır beslemesi ekleyelim
ve size tekrar gösterelim.
Şimdi bir sıfır görüyoruz,
doğru yanlış. Jason Jason birbirine eşittir.
Jason'ın Jason'ı eşit değil.
Bunlar artık öğrenebileceğiniz bazı
hızlı işlevlerdir, temel olarak karakter dizileri ve dizelerin bu kavramla
nasıl temsil edildiği hakkında bilgi edinin.
Teşekkür ederim. Daha detaylı inceleyebilmeniz için kaynak dosyayı da vereceğim.
Umarım bu, ödevinize yardımcı olmuştur.