C usulü stringlerde ve C++ STL stringlerinde eleman sayısını bilmeden tüm string elemanlarını dolaşın!

Merhaba arkadaşlar!

Bugün sizlerle özellikle yeni başlayanların bir sorunu hakkında konuşacağız.

Bu C ve C++ için geçerli.


Yeni başlayanlar, yani en azından ben yazılıma ilk başladığımda, bu char tipli dizilerde, yani C-style stringlerde nasıl tamamen gezinip tüm elemanları, o dizinin eleman sayısını bilmeden bulabileceğimizi merak etmiştim.

Daha sonra aradan 1 ay geçti ve o eğitimde C++'ın standart kütüphanesine (STL) denk geldim. Tabii, eğitimde tam anlatılmamıştı. String kütüphanesi vs. yoktu.

Daha sonra, bu STL'i biraz araştırırken strlen() fonksiyonu gözüme çarptı. GitHub'taki projelerden biraz kullanımına baktım ve anladım. (Zaten adı üstünde bir fonksiyon kendisi ama neyse...)


Efendim, bugün de sizlere bunu anlatacağım. Nedir bu fonksiyon? Kimin nesidir? C++'taki std::string ile uyumu var mıdır? Veya başka bir implementasyonu? Hadi gelin birlikte bakalım.


Öncelikle fonksiyonumuz, belki de yukarıda da anlayabileceğiniz gibi, strlen() fonksiyonu. Hemen bir kullanımına bakalım. Bu arada, kendisi string.h kütüphanesindedir. Eğer C++ kullanıp C-style string ile iş yapacaksanız <cstring> olarak yazabilirsiniz.

size_t strlen ( const char * str );

Anlaşılacağı üzere, size_t bir değer döndürüyor ve const char* tipinde verileri parametre olarak alıyor. char[] da alıyor canım, endişelenmeyin.

Örnek kodumuzu yazalım dilerseniz.

C++:
#include <iostream>
#include <cstring> //strlen() fonksiyonumuz burada durmaktadır. C dili için ise string.h kütüphanesidir.
using namespace std;

int main(){
  
    char Cstr[] = "Hello world!";
  
    unsigned int length = strlen(Cstr); /*Bildiğiniz gibi, unsigned int, size_t'ye tekabül eder. (Eğer değiştirilmediyse.) Fakat int olarak ta dönüş değeri bekleyebilirsiniz. Çevirmeyi otomatik yapar.*/
  
    cout<<"Cstr stringinin uzunluğu : "<<length<<" karakter."<<endl;
  
  
    return 0;
}

Peki C++ style olan std::string karşımıza gelince ne yapacağız? Onda, bu olay daha da basitleştirilmiş.

C++:
#include <iostream>
#include <string> //std::string'in durduğu yer.

using namespace std;

int main(){

        string cppstr = "Technopat";
      
        cout<<"Yazdığımız cppstr değişkeninin uzunluğu : "<<cppstr.length()<<" karakter."<<endl;



    return 0;
}


Evet, şimdi gelelim stringler üzerinde işlem yaparken kullanacağımız for döngüsünün yapısına. O daha da basit. Tahmin edebildiğinizi düşünüyorum az çok.


C++:
/*

.............
Kodun devamı
.............
*/
for(int i = 0; i < strlen(Cstr); i++){ /*Eğer C++'ta C style string kullanacaksanız, i'yi auto yapabilirsiniz. int te kalabilir, sorun yok. Bazı derleyicilerde uyarı verebilir diye söyledim. Bazı derleyiciler bunun için C++11 standardı parametre isteyebilir. G++ için -std=c++11 yazmanız yetecektir sonuna.*/

        /*Çalışacak kod buraya*/


}
/*Kodun devamı...*/

Veya C++ usulü olan std::string kullanıyorsanız da ortaya şöyle bir şey çıkar.

C++:
/*

...........
Kodun devamı
...........

*/
for(auto i = 0; i < cppstr.length(); i++){

            /*Kodunuz buraya*/


}

/*Kodun devamı.*/


Yazımı okuduğunuz için teşekkürler!

Yorumlar

Ufak bir ekleme yapmak istiyorum yazıdan yanlış anlaşılabileceğini düşündüğüm için, C tipi string dediğimiz şey aslında char arrayıdır, Ve önemli kısım, array dediğimiz şey aslında sadece allocate edilmiş (RAM'de yeri ayrılmış) bir pointerdır. C kodlamayalı uzun zaman oldu ama şöyle anlatmam gerekirse;

Çok kısa pointer nedir notu : Pointer, RAM'de bir yeri ve o yerin hangi veri yapısı türünde olduğunu gösteren bir veri yapısıdır.

char array[5]; //Klasik 5 elemanlı array oluşturma syntaxı

ile

char *array; //Char tipinde bir pointer oluşturmak
array = malloc(5*sizeof(char)); //Ve o pointer için 5 tane char'a yetecek kadar yer ayırmak

arasında hiçbir fark yoktur. "Hiçbir fark yoktur" derken "aynı işe yarıyor" demiyorum. Birebir aynı işlemler yapılıyor diyorum.

Eklemek istediğim şey ise; strlen fonksiyonun "const char *" alması demek, bir char tipi pointer aldığını (allocate sayısına bağlı olarak array veya normal bir char olabilir) ve onun "constant" olduğunu (yani fonksiyonda değiştirilmeyeceğini) belirtir.
Yani "char[] de alıyor merak etmeyin" demek yerine bu bahsettiğim şeye çok hızlı girip çıksanız, yeni başlayanlar için ileride oluşabilecek kafa karışıklığının önüne geçmiş olurdunuz.

Bunun dışında güzel yazı, beğeniyi bıraktım.
 
Ufak bir ekleme yapmak istiyorum yazıdan yanlış anlaşılabileceğini düşündüğüm için, C tipi string dediğimiz şey aslında char arrayıdır, Ve önemli kısım, array dediğimiz şey aslında sadece allocate edilmiş (RAM'de yeri ayrılmış) bir pointerdır. C kodlamayalı uzun zaman oldu ama şöyle anlatmam gerekirse;

Çok kısa pointer nedir notu : Pointer, RAM'de bir yeri ve o yerin hangi veri yapısı türünde olduğunu gösteren bir veri yapısıdır.

char array[5]; //Klasik 5 elemanlı array oluşturma syntaxı

ile

char *array; //Char tipinde bir pointer oluşturmak
array = malloc(5*sizeof(char)); //Ve o pointer için 5 tane char'a yetecek kadar yer ayırmak

arasında hiçbir fark yoktur. "Hiçbir fark yoktur" derken "aynı işe yarıyor" demiyorum. Birebir aynı işlemler yapılıyor diyorum.

Eklemek istediğim şey ise; strlen fonksiyonun "const char *" alması demek, bir char tipi pointer aldığını (allocate sayısına bağlı olarak array veya normal bir char olabilir) ve onun "constant" olduğunu (yani fonksiyonda değiştirilmeyeceğini) belirtir.
Yani "char[] de alıyor merak etmeyin" demek yerine bu bahsettiğim şeye çok hızlı girip çıksanız, yeni başlayanlar için ileride oluşabilecek kafa karışıklığının önüne geçmiş olurdunuz.

Bunun dışında güzel yazı, beğeniyi bıraktım.
Teşekkürler. Açıkçası dün biraz acelem vardı, orasını ondan çok hızlıca geçtim. :)
 

Blog girdisi detayları

Ekleyen
TerabyteForever
Okuma süresi
2 dakika okuma
Görüntüleme
658
Yorumlar
3
Son güncelleme

Yazılım kategorisindeki diğer girdiler

TerabyteForever adlı kullanıcının diğer girdileri

Bu girdiyi paylaş

Geri
Yukarı