Merhaba, tekrar hoş geldiniz. Bu derste, dize fonksiyonları hakkında konuşmaya başlamak istiyorum.
Daha önce stringlerin, karakter
dizilerinin c'de değişken bir veri tipi
olmadığından bahsetmiştim.
Dolayısıyla, operatörlerden herhangi birini kullanabilirsiniz,
ancak yine de dizeler üzerinde birçok şey yapabilmeniz gerekecektir.
Onları manipüle edebileceksiniz.
Uzunluğunu almak isteyeceksin. Onları karşılaştırmak istiyorsanız,
her türlü şey muhtemelen onları dönüştürür.
Neyse ki standart kütüphane bu tür işlemleri gerçekleştirmek için kullanabileceğiniz
bir dizi fonksiyonla birlikte gelir.
İlk olarak en yaygın olanlardan bazılarından bahsetmeye başlayacağım
ve daha sonra diğer derslerde daha spesifik olanlara geçeceğiz.
Karakter dizisinin null karakteri ile sonlandırılan
bir karakter dizisi olduğunu zaten biliyoruz.
Karakter dizileri c programlarında yaygın olarak kullanılır.
Neyse ki C, dizelerle çalışmak için özel olarak tasarlanmış birçok işlev sağlar.
Tartışacaklarımız, kullanacağınız en yaygın olanlardır.
İlk olarak, str length fonksiyonunu kullanarak bir dizenin uzunluğunu elde edin.
Bir karakter dizesini diğerine kopyalama.
Daha önce bir dize atamak için atama işlecini kullanamayacağınızı söylediğimi hatırlayın.
Yani yapacağınız şey str copy veya strn copy kullanmaktır.
Ayrıca, iki karakter dizisini bir araya getirme, birleştirme.
Bir str kedisi ve bir de strn kedisi var.
Ve iki karakter dizisinin eşit olup olmadığını belirleme.
Yine, eşittir eşittir işleci dizileri karşılaştırmak için çalışmayacaktır
çünkü bunlar dizidir.
Bu nedenle, dizeleri karşılaştırmak istiyorsanız, c kütüphanesi tarafından sağlanan
özel işlevleri kullanmanız gerekir. Str karşılaştırma ve strn karşılaştırma.
İlk olarak, uzunluk hakkında konuşalım.
Tüm bu işlevler dizede tanımlanmıştır. başlık dosyası, bu nedenle bu işlevlerden
birini çağırdığınızda veya çağırdığınızda bunu eklemeniz gerekir.
Bir dizenin uzunluğunu alma.
Str length, dizenin uzunluğunu bulan bir fonksiyondur, oldukça basittir.
Bir t boyutu değişkeni olarak döndürülür.
Size t değişkenini hemen hemen bir int ile değiştirerek kullanabilirsiniz.
Ancak öncelikle, str uzunluğunu kullanmak istiyorsanız bu string başlık dosyasını eklemeniz gerekir
ve bu şekilde kullanırsınız.
Temel olarak çift tırnak içinde bir string literal oluşturur ve bunu bir karakter dizisine atarsınız.
Karakter dizisinin boyutunu belirtmezsiniz.
Derleyici bunu sizin için yapacak ve null sonlandırıcıyı ekleyecektir.
Stringimi bir string sabiti ile tanımladıktan
sonra, str length'i çağırabilir ve sadece o karakteri geçirebilirsiniz,
oldukça güzel.
En sık kullanılanlardan biridir, çünkü doğrulama kontrolleri yaparken veya herhangi bir şey yaparken
genellikle bir dizenin bu uzunluğunu almak istersiniz, gerçekten arabellek
taşması olmadığından emin olmak istiyorsanız bunu da yapabilirsiniz.
Bu işlev dizeyi değiştirir.
Dolayısıyla, işlev başlığı resmi parametre dizesini
bildirirken sabit kullanmaz.
Eğer gidip iplere bakacak olursanız. h dizininizdeki
user include içinde, bir sabit olarak tanımlanmadığını
görürsünüz.
Dizeler kopyalanıyor. Dizeleri kopyalamak ya var olan bir
dizeyi değiştirmek ya da içinde bazı veriler
olan var olan bir karakter dizisini değiştirmektir.
Ya da içinde bir şey yoksa, içine bir şey koymak istersiniz.
C'de bir zam atayamayacağınız için, dizeleri de atayamazsınız. Bundan daha önce bahsetmiştim, bir karakter
bildirmek ve ardından eşittir atama operatörünü kullanmak işe yaramaz.
Yapmanız gereken şey, bir dizeyi mevcut bir dizeye kopyalamak
için str copy işlevini kullanmaktır.
Dizeler için bir işleç olan atama işlecine eşdeğerdir.
Kaynak ve hedef olmak üzere iki karakter dizisi bildirirsek,
tek yapmamız gereken str copy source demek ve ardından kaynak
ne olursa olsun dizeye koyabiliriz ve aynı şeyi hedef için
de yapabiliriz.
Bunları kopyalamak isterseniz değişkenleri de buraya koyabilirsiniz.
Ancak burada yaptığımız şey, ilk parametrenin kopyaladığınız yer olmasıdır.
İkinci parametre kopyaladığınız dizedir.
Yani kaynak, str kopyalamadan sonra içinde bu kaynak olacaktır.
Destination veya dest, str kopyalama çağrısından sonra içinde
bu hedefe sahip olacaktır.
str kopyalama işlevi, kaynak dizenin hedef dizeye gerçekten uyup uymadığını kontrol etmez.
Peki büyük bir ipiniz olsaydı ne olurdu?
Peki, önceki örnekte bir hedefte 100 karakter olsaydı ne olurdu?
Ve hedef olarak bunu almak yerine 100 karakter vardı.
Sadece 50 karakterden oluşan bir kaynağa
kopyalamayı denediniz. Bir sorun olabilir.
Hedef dize, kopyaladığınız kaynak dizeden daha büyük olacaktır.
Dolayısıyla, bunu kaynak olarak kopyalamak yerine kaynak olarak kopyalamaya çalışırsak,
bu beş kez veya on kez kaynaklıdır ve 50'nin üzerinde bir tane koyarsak, bir hata
olacaktır.
Ve bunu göstereceğim.
Bu yüzden dizeleri kopyalamanın daha güvenli bir yolu strn copy kullanmaktır. n'nin strn kopyasına dönüştürülebileceğini
fark edeceksiniz.
Strn kopyalama üçüncü bir bağımsız değişken alır.
Kopyalanacak maksimum karakter sayısı.
Yani burada aslında ne kadar kopyalamak istediğinizi belirtiyorsunuz.
Dolayısıyla, 40 boyutunda bir kaynağınız ve 12 boyutunda bir hedefiniz varsa, önce bir hedef
içindeki verilerin boyutunu null sonlandırıcılara ayarlayan bir m seti yapabilirsiniz, böylece
bir şey eklediğinizde otomatik olarak orada olacaktır, bunun için endişelenmeyin.
Str kopyası hello how are you doing'i kaynağa kopyalayacak ve how are you doing'in
kaynaktan daha büyük olup olmadığını kontrol etmeyecektir.
Ancak bir strn kopyalama yaparsanız ve bir hedefe kopyalarsanız,
kaynağı kopyalayacak ve yalnızca ilk 10 karakteri kopyalayacaktır.
Bu yüzden üçüncü argüman hedefin boyutuna karşılık gelmelidir.
Şimdi kod bloklarına girelim ve str uzunluğuna bakalım ve bunların tam olarak nasıl çalıştığını görmek
için dizeleri kopyalamaya bakalım.
İşte burada, ana konumuz var.
Ve dize uzunluğu dizesini elde etmek gerçekten kolaydır.
Karakter dizimizi oluşturacağız. Bir karakter alanının nasıl yaratılacağını biliyoruz. Boyutu belirtmek istemiyoruz,
ancak önce adı sonra parantezleri koymalıyız.
Ve sonra çift tırnak içinde istediğimiz
şeyle başlatabiliriz. Çift tırnaklar dize değişmezlerini temsil eder.
Bu yüzden adımın Jason olduğunu söyleyebilirim.
Bunun sonucunda
17 karakter boyutunda bir dizi elde edilecektir.
Bu karakterlerin tümü artı null sonlandırıcı.
Boş sonlandırıcı ters eğik çizgi sıfırdır.
Derleyici tarafından otomatik olarak ekleneceği için bunu oraya koymanız gerekmez.
Bir karakter dizisini bu şekilde başlatabilir ve oluşturabiliriz.
Sonra bunu yazdırmak için tek yapmamız gereken printf demek ve uzunluğun ne olduğunu söylemek.
Ve sonra bir dizeyi görüntülemek için biçim
belirteci olarak yüzde s'yi koyarız.
Ve sonra tek yapmamız gereken dizenin adını söylemek.
Karıştırmamak için sadece ipim diyelim.
Ve daha önceki örneklerde yaptığımız gibi ve işareti kullanmak zorunda değiliz,
sadece benim dizem diyebiliriz. Bunu derler ve çalıştırırsak, string
başlığını eklediğimizden de emin olmamız gerekebilir.
Bunu derleyip çalıştırdığımızda, dizenin uzunluğunu göreceksiniz.
Yani uzunluk ve ben dize uzunluğu işlevini çağırmadım.
Bu nedenle, uzunluğu görüntülemek istiyorsanız aslında işlevi çağırmanız gerekir, bu yüzden
sadece böyle bir şey yaparsınız. Dizeyi str uzunluğunun içine koyarsınız.
Şimdi çalıştırdığınızda, dizenin uzunluğunu gerçekten göreceksiniz.
Bu bir dize değil, bir gerçek olmalıdır.
Dizeyi bu şekilde görüntüleyebilirim. Dizenin uzunluğunu görüntülemek istersem,
işlevi çağırırken yüzde d yaparım.
Şimdi çalıştırdığımda,
aslında uzunluk olan 16'yı yazdırdığını fark edeceksiniz.
Bu yüzden str uzunluğunu kullanmak oldukça kolay bir işlevdir. Dizeleri kopyalamak istiyorsanız,
str karşılaştırmasını kullanırsınız.
Ve baytları gerçekten belirtmek için strn karşılaştırmasını kullanmak istersiniz.
Yani burada benim adım Jason ise ve sonra
başka bir dize oluşturursak, aslında
sadece bunu tutacağız. Belirtmek zorunda bile kalmayacağız
ve yapacağımız şey temp adında başka
bir dize oluşturmak diyeceğiz ve bu str'ye eşit
olacak ve karşılaştıracağız, kopyalamak
istediğimiz şeyi geçeceğiz.
Sadece boş bir karakter dizisi oluşturun ve bunu
50 boyutlu yapacağız.
Ve burada yapacağımız şey strn copy demek olacak.
İlk parametre kopyalamak istediğimiz yerdir, temp diyeceğiz.
İkinci parametre kopyalamak istediğimiz şeydir, bu da benim dizemdir.
Ve sonra 50 bayttan fazlasını geçirmek istemiyoruz.
Yani aslında 50 bayttan fazlasını geçirmek istemediğimizi
söylemek için temp boyutu diyebiliriz. Ve muhtemelen null sonlandırıcı için
-1 yapmak istersiniz.
Bu şekilde, üçüncü parametre gerçekten önemlidir çünkü asla arabellek taşması yaşamayacağız.
Her zaman strn copy kullanmalısınız, str copy değil.
Ve sonra burada kopyalanıp kopyalanmadığını görmek için dizemizi görüntüleyebiliriz.
Temp diyebiliriz, bunu yüzde s olarak değiştirebiliriz.
Ve bunu oluşturduğumuzda, uzunluğu
değil, dizenin böyle bir şey olduğunu görmeli ve noktalı
virgülle bitirmeliyiz.
Şimdi derlemeliyiz.
Şimdi çalıştırıyoruz. Sadece kopyaladığımız dizeyi görmeliyiz.
Böylece adımın Jason olduğunu ve temp'in içinde depolandığını
görüyoruz çünkü temp'i yazdırdık.
Ancak her zaman strn kopyasını kullanın. Str kopyalama kullanmayın, bu tampon
taşmaları yaşamamanızı sağlayacaktır.
Ve üçüncü parametre her zaman
hedef olmalıdır, kaynak değil,
hedef. Bu dizenin tamamını kopyalayın demek anlamsız olacaktır.
Çünkü bu daha küçükse, sorun yaşarsınız. Bu yüzden her zaman bunun boyutunu söyleyin.
Ve karakterin içinde kaç bayt olduğunu görmek
için sizeof operatörünü kullanabileceğinizi görüyorsunuz.
Biraz daha fonksiyonlardan bahsedelim.
Yani uzunluğu nasıl alacağımızı biliyoruz, dizeleri nasıl kopyalayacağımızı biliyoruz, dizeleri birleştirmeye ne dersiniz?
str cap fonksiyonu iki argüman alır, argüman olarak iki
string alır ve ikinci stringi birincinin sonuna kopyalar.
İkinci dize değiştirilmez, sadece
birincisi değiştirilir. İlk bağımsız değişkeninin değerini döndürür.
İkinci dizenin eklendiği dizenin ilk karakterinin adresi.
Bu yüzden bir şey döndürün, bunu kullanmanız gerekirse aslında nereye eklediğinizi söyleyin.
İşte bir örnek, benim dizemin bir karakter dizesini oluşturuyoruz
ve bu sadece benim dizemi null sonlandırıcı ile içeriyor.
Bir karakter dizisi oluştururuz, bu 80'dir ve boştur.
Birleştirilecek bir dize girin diyoruz. İçeride okuduk.
Ve sonra birleştiriyoruz.
Orijinal dizeyi, ardından birleştirilmiş dizeyi ve sonra da girişi yazdırırız.
Yani bundan sonra, girdiğiniz her şey benim dizemin
sonuna eklenecektir. Yani Jason'ı girerseniz, bu benim uzay dizim Jason olur.
Benim ipim de buna eşit olurdu.
Çünkü üzerinde str cat yapıyorsun.
Önce dizeyi yazdırıyoruz ve sonra üzerinde str cat'i çağırıyoruz.
Girdi aslında girilen her neyse ona eşit olacak, benim
dizem ve ardından girilen her neyse.
Bu örneği birazdan inceleyeceğiz. Şimdi tıpkı str copy gibi,
str cat'in de bir strn end cat'i vardır.
Böylece birleştirilmiş versiyon yeni ilk dize olur.
Yani tıpkı str cat ile dize birleştirme gibi, bir
strn cat vardır.
Str cat, str copy ile aynı soruna sahiptir. Tampon taşması olabilir. Aslında ikinci dizenin
ilk diziye sığacağından emin olmaz.
Dolayısıyla, bu ilk dizide yeterli alanınız yoksa, arabellek taşması sorunlarıyla karşılaşabilirsiniz.
Yani bir strn kedisi kullanmak istiyorsunuz.
İkinci bağımsız değişken eklenecek maksimum karakter sayısını belirtir.
Örneğin, bir strn cat ve iki string bugs
bir add-on yaparsanız, hangisinin önce geldiğine bağlı olarak sadece add-on'un ilk 13 karakterini
bugs'a ekleyecektir. Eklenti 13'ten küçükse, yalnızca
null sonlandırıcıyı görene kadar ekleme yapacaktır.
Yani bu örnekte iki dizgi oluşturuyoruz.
Bu kaynak bu hedeftir. Bir strn kedisi yapıyoruz.
Sonunda hedefe sadece 15 karakter
kopyalıyoruz. Dolayısıyla, hedefin boyutu ne olursa olsun, hedefin
boyutu artı 15 olacaktır ve sonra bunu yazdırırız.
Şimdi buna tekrar kod blokları halinde bakalım.
İşte örneğimiz ve iki karakter dizisi dizisi oluşturacağız,
biri 50 boyutunda, diğeri 50 boyutunda.
Bunları verilere ayarlamak için iki str kopyası yapacağız.
Bu, kaynağın hedefidir. Ve sonra 12. satırda, strn cat işlemini yaparız.
Ve hedef, birleştireceğimiz şey olacaktır.
Yani kaynak, birleştireceğimiz şey olacak.
Ve sadece 15 karakter atayacağız.
Yani kaynak 15'ten büyük olsaydı, hepsini
kopyalamazdık.
Yani bunu oluşturup çalıştırdığımızda,
şimdi this is source file dediğini
göreceksiniz ya da this is destination ve ardından this
is source diyecek.
Yani burası hedef, burası kaynak diyor.
Bunu hedefin sonuna ekler.
Bu yüzden her zaman birleştirme için strn cat kullanmak istersiniz, böylece tampon taşmaları yaşamazsınız.
Str kopyalama yerine yanlışlıkla str karşılaştırma dediğim str
karşılaştırma hakkında konuşalım.
Bu yüzden dizeleri karşılaştırmak için de bir fonksiyon kullanmamız gerekir.
Bir dizeyi diğeriyle karşılaştırmak istiyorsanız,
çift eşittir kullanamazsınız, bu yalnızca aynı adrese sahip olup
olmadığınızı kontrol eder. Yani kullanmanız gereken şey str karşılaştırmasıdır.
Bu, dize içeriklerini karşılaştıracaktır.
Diziyi karşılaştırmaz. Bu nedenle, farklı boyutlardaki dizilerde
saklanan dizeleri karşılaştırmak için kullanılabilir.
Karakterleri karşılaştırmaz.
Apples ve a gibi argümanları çift tırnak içinde kullanabilirsiniz, ancak
tek karakterli a gibi karakter argümanlarını kullanamazsınız.
Bu fonksiyon, ilişkisel operatörlerin sayılar için yaptığını dizeler için yapar.
Dolayısıyla, karşılaştırma işlevi size dizenin
eşit olup olmadığını, daha büyük olup olmadığını veya daha küçük olup olmadığını
söyleyen bir değer döndürecektir.
Eğer eşitse, sıfır dönecektir.
less than ise, str one str two'dan küçükse sıfırdan
küçük döndürür.
Ve str iki str birden küçükse sıfırdan büyük dönecektir.
Peki bu tam olarak ne anlama geliyor? Size bunun nasıl işlediğine
dair bir örnek vereyim.
Bunu kod bloklarına koyalım ve çalıştıralım.
Ancak burada bir grup str karşılaştırması yapıyoruz ve size değerlerin ne olduğunu, küçük mü yoksa büyük
mü olduklarını söyleyeceğiz çünkü bu çok net değil.
Şimdi bunu ele alalım ve kod blokları halinde inceleyelim.
İşte örneğimiz. Ve bir grup dizgiyi karşılaştırıyoruz ve ardından sıfır
bir veya başka bir şey olsun, str karşılaştırmasının
sonuçlarını görüntülüyoruz.
Dolayısıyla, a ve a dizelerini karşılaştırırsanız, bunların çift tırnak içinde olması gerekir.
Ve burada gördüğünüz şey, ne dediğimizin çıktısını almaktır.
Bu yüzden tırnak işaretlerini
sınırlandırıyoruz. Ters eğik çizgi koyuyoruz, böylece aslında bir tırnak karakteri
yazdırıyoruz ve dizeyi sonlandırmıyor. Ancak a ve a'yı karşılaştırırsak,
bunun sıfır döndürmesi gerekir. Çünkü sıfır, dizelerin eşit olduğu anlamına gelir.
Eğer a ve b'yi karşılaştırırsak, str karşılaştırması less than döndürmelidir.
Çünkü a, b'den küçüktür.
B a sıfırdan büyük bir değer döndürmelidir.
Ancak bunun üzerinden geçelim, herhangi bir hata yapmadığımdan
emin olalım ve bunu gerçekten çıktıda göreceğiz.
Bunu çalıştırdığımızda hangi
sayıların döndürüleceğini hatırlamanıza yardımcı olur.
Yani a ile a'yı karşılaştırdığınızda aslında 0 elde edersiniz.
Eğer a ve b'yi karşılaştırırsanız, b a'dan küçüktür,
bu yüzden negatif birdir, sıfırdan küçük bir şeydir,
tersini de söyleyebilirdim, bakın ben bile
hala karıştırıyorum. Çünkü a b'den büyüktür, a b'den
büyüktür, negatif bir.
B, a'dan küçüktür, dolayısıyla sıfırdan büyük bir şey elde edersiniz ki bu da birdir.
C, a'dan büyüktür, bu yüzden b'nin a'dan büyük olduğu gibi
bir tane elde edersiniz.
Ve sonra büyük ve küçük harfleri karşılaştırıyorsunuz.
Büyük ve küçük harfleri karşılaştırdığınızda, tersini yapar. Z aslında küçük a harfinden
daha azdır.
Yani büyük harf her zaman küçük harften daha azdır.
Elma ile elmayı karşılaştırmaya çalışırsanız, 1 olacaktır çünkü
elma elmadan daha azdır.
Karşılaştırmalar da bu şekilde işliyor. 0'ın 1'den büyük veya 1'den küçük olduğunu
anlamak önemlidir. Yine sıfırdan küçük,
ilk dizenin ikinci dizeden küçük olduğunu söyleyecektir.
Sıfırdan büyükse, ilk dizenin ikinci dizeden büyük olduğunu söyleyecektir.
Bu fonksiyonun kullanımı çok kolaydır. Herhangi bir strn karşılaştırması
konusunda endişelenmenize gerek yoktur çünkü karşılaştırdığınız dizilerin
boyutu önemli değildir.
str karşılaştırma işlevi, farklı olan karşılık gelen karakterleri bulana kadar dizeleri karşılaştırır.
Yani tellerden birinin sonuna kadar olabilir.
Strn karşılaştırma işlevi, dizeleri farklı olana kadar veya üçüncü bağımsız değişken tarafından
belirtilen sayıda karakteri karşılaştırana kadar karşılaştırır.
Yani bu durumda, arabellek taşmaları için strn karşılaştırmasını
kullanmanıza gerek yoktur. Var, ancak yalnızca belirli sayıda karakteri
karşılaştırmak istediğinizde kullanırsınız.
Str copy veya strn copy
veya strn cat'ten farklı kullanılır.
strn karşılaştırması sadece şu kadar karakteri görüntülemek istediğimi söylüyor.
Bu nedenle, yalnızca bir önek arıyorsanız yararlı olacaktır.
Yani astro ile başlayan dizeleri aramak istiyorsanız, aramayı
ilk beş karakterle sınırlayabilir ve strn karşılaştırmasını
bu şekilde kullanırsınız.
Yani bu örnekte eşittir eşittir sıfır dediğimizi görüyorsunuz.
Str karşılaştırmasını kullanırken sık sık bunun gibi bir if deyimi görürsünüz.
Bu ifadenin içinde str compare ifadesini görüyorsunuz ve eşit olduğunu söylemek için equals eşittir sıfır.
Yani strn compare ilk beş karakteri kullanır, astro'yu
astronomy'nin ilk beş karakteriyle karşılaştırır.
Onu bulduğunu söyleyecek. Sıfıra eşit olacak ve üzerinde astronomi bulundu yazacak.
Aynı şeyi, astounding adlı farklı bir dizeyle karşılaştırarak yaparsanız,
onu bulmayacak, aslında gösterecektir - astounding'in astro'dan
daha büyük olduğunu söyleyecektir. Yani 0'dan büyük bir şey gösterecektir,
bu da 1'dir ve herhangi bir veri göstermeyecektir.
Bu nedenle, tüm içerikler için dizeleri karşılaştırırken str karşılaştırmasını kullanın.
Yalnızca öneki bir dizeyle karşılaştırmak istediğinizde strn karşılaştırmasını kullanın.
Aynı tür sözdizimi veya strn sadece üçüncü argümanı karşılaştırır.
Bu yüzden kullanacağımız bazı önemli fonksiyonlar
hakkında çok konuştuk, özellikle str length,
strn copy, strn cat ve strn compare.
Bu fonksiyonları kullanmanız gereken bir görevimiz olacak ve bu sayede bu fonksiyonlara
aşina olacaksınız.
Ancak buna gerçekten aşina olacaksınız çünkü sonunda
bunları tekrar tekrar kullanacaksınız. Teşekkür ederim.