İçeriğe atla

C++/S3/String

Vikikitap, özgür kütüphane
< C++

C++ İLE PROGRAMLAMA
Kitap hakkında      Başlangıç    Temel kavramlar      Nesne      Gelişmiş özellikler       Standart kütüphane     API
Başvuru kaynakları        Ek kaynaklar      Kod örnekleri    
Acemiler için alıştırmalar

C++ İle Programlama

Bir programlama dili kitabı
C++ İle Programlama
C++ İle Programlama
Standart kütüphane
Bu şablonu düzenle

String (dizgi) sınıfı

[değiştir]

Temel kullanım

[değiştir]

Metin giriş/çıkışı

[değiştir]

Belki de dizgi (string) sınıfının en temel kullanımı aşağıdaki kod parçasında olduğu gibi kullanıcıdan veri almak ve bunu ekrana yazmak içindir.

 std::string isim;
 std::cout << "Lutfen isminizi girin: ";
 std::cin >> isim;
 std::cout << "Hosgeldin " << isim << "!";

Her ne kadar dizgi (string) boşluklar içeren bir karakter dizisini tutabilse de, bir dizgiyi operator (>>) ve cin kullanarak okumaya çalıştığımızda sadece string içinde ilk boşluğa kadar olan karakterlerin depolandığını göreceksiniz.

C++'de de standart dizgilerin (string) içine ne koyarsanız koyun genişleme gibi güzel bir özellikleri var. Böylece megabaytlarca bilgi koyarsanız bile tekrar o bilgileri geri verebilir -- İşletim sisteminin getirdiği sınırlar dahilinde Bu yüzden bir satır okumak istiyorsak getline işlevini kullanabiliriz.

 std::getline(std::cin, isim);

Bu şu demek giriş akımından cin bir satır oku ve bunu string değişkenimize (isim) at.

Daha gelişmiş dizgi kullanımı

[değiştir]

Aşağıdaki rastgele dizgiyi örneklerimizin bazıları için kullanacağız.

  string yazi = "Merhaba Dunya!";

Bu varsayılan kurucuyu const char* bir argümanla çağırır. İlk değer atanmamış bir dizgi hiç bir şey içermez, yani hiç bir karakter içermez.

 string ikinci = ilk;

Kopyalama kurucusunu (copy constructor) çağıracaktır. std::string sakladığı karakterleri kopyalayabilmek için yeterli bilgiye sahiptir.

Boyut
[değiştir]
 int string::size(void);
 int string::length(void);

size () ve length () işlevlerinin her ikisi de dizgimizin uzunluğunu verir. Bu ikisi arasında açık bir fark yoktur. Unutmayın ki bir dizgide son karakter size() karakter değil size() - 1 dir. C stili dizgilerde ve genelde dizilerde olduğu gibi std::string saymaya 0'dan başlar.

Giriş/Çıkış
[değiştir]
 ostream& operator<<(ostream &out, string str);
 istream& operator>>(istream &in, string str);

Kaydırma operatörleri (>> ve <<) yüklenmiştir. Böylelikle giriş çıkış nesnelerini bilhassa cin, cout ve dosya akımlarını (filestream) kullanarak giriş/çıkış işlemleri gerçekleştirebiliriz. Yani konsolda giriş ve çıkışı sağlamak için dizgiyi bu akımlara (>> ve <<) operatörleri kullanarak yönlendirmek yeterlidir:

 std::cout << yazi << '\n';
 std::cin >> yazi;
 istream& getline (istream& in, string& str, char delim = '\n');

Alternatif olarak tek seferde bir satır okumak istiyorsak getline () kullanabiliriz. getline () string sınıfına ait bir üye işlev değildir. getline () giriş akımından karakterleri alacak ve bunu dizgimize dosya sonuna varılıncaya kadar (EOF) ya da sınırlandırıcı karakter (delim) rastlanıncaya kadar okuyacaktır. getline () işlevi dizgiye veri eklemeden önce dizginin içeriğini sıfırlar. Sınırlandırıcı karakter (delim) herhangi bir karakter değer olabilir. Aşağıda örnek bir kullanım verilmiştir:

#include <iostream>
#include <fstream>

int main ()
{
    // Bir dosyayı aç
    std::ifstream dosya("deneme.cpp");
    std::string veriler, gecici;
    while (!dosya.eof ()) // dosyanın sonuna gelinmediği sürece
    {
        // '#' karakterine ulaşana kadar bilgileri oku
        // bunları giriş akımından al ve gecici'ye at
        getline (dosya, gecici, '#');
        // bu bilgileri veriler ismindeki diğer
        // dizgiye ekle
        veriler += gecici;
    }
    std::cout << veriler;
}

getline işlevi bir giriş akımı döndürdüğünden iç içe getline() işlevleri yazılabilir ancak bu kodun okunabilirliğini düşürdüğünden tavsiye edilmez.

Operatörler
[değiştir]
 char& string::operator[](int pos)

Dizgilerdeki karakterlere karakter dizilerinde (C stili diziler) olduğu gibi farklı görev yüklenmiş ([]) işleci ile ulaşılabilir.

 std::cout << yazi [1] << yazi [2];

"er" yazar .

std::string C stili dizilerden const char* dönüşümü destekler. Ayrıca C stili dizileri bir dizgiye ekleyebilir veya atayabilirsiniz. Bir C stili diziyi (char*) bir dizgiye atamak bunun gibi basittir:

 yazi = "Merhaba Dunya";

Eğer bunu karakter karakter yapmak isterseniz, bunu da kullanabilirsiniz

 yazi = 'H';

Yine toplama (operator+) ve ekleme (operator+=) operatörleri bildirilmiştir. Bu da şu demek oluyor. + ve += operatörlerini kullanarak bir dizgiye const char*, char, ya da başka bir dizgi ekleyebilirsiniz. Daha da açık anlatmak gerekirse + ve += operatörleri ile bir dizgiye bir C stili dizi, bir karakter, ya da bir dizgi eklenebilir.

Karşılaştırma operatörleri >, <, ==, >=, <=, != C'deki strcmp () işlevine benzer şekilde diziler üzerinde her türlü karşılaştırma işlemlerini yapabilir. Bu işlevler mantıksal bir değer true/false döndürür.

 if (yazi == "Merhaba Dunya!")
     {
         std::cout << "Dizgiler esit!";
     }
Dizgilerde arama
[değiştir]
 int string::find(string findstr, int pos);

find () üye işlevini kullanarak bir dizginin ilk bulunduğu yeri bulabilirsiniz. find () aranan dizgi için (findstr), konumdan itibaren (pos) aramaya başlayacak ve aranan dizginin ilk bulunduğu noktayı verecektir. Örneğin : ( --> içinde arama yaptığımız dizgi Merhaba Dunya! -- )

 string aranan = "a";
 std::size_t konum = yazi.find (aranan, 0);
 cout << aranan << " nın konumu: " << konum << '\n';

"a'nın konumu: 4" yazacaktır. Yani "a" ilk kez dizgide 4.sırada bulunmuş. Eğer "Dunya!" daki "a" yı bulmak isteseydik konumu değiştirerek a'nın ilk ve ikinci bulunduğu yerleri atlayacak şekilde 7.sıradan aramaya başlatmamız gerekirdi. Eğer aranan dizgi bulunamazsa find() bir string::npos döndürür. Aşağıdaki kod bir dizgi içinde 'wiki' kelimesini arıyor ve konumlarını yazıyor:

 string yazi = "wikipedia wiki sayfalarından oluşur (wiki-wiki hızlı demek)";
    
 for (size_t i = 0, tfind; (tfind = yazi.find ("wiki", i)) != string::npos; i = tfind + 1)
 {
    cout << "'wiki' kelimesini burada buldum: " << i << endl;    
 }
int string::rfind(string findstr, int pos);

rfind () üye işlevi de benzer şekilde çalışır, tek farkla ki aranan dizginin son bulunduğu noktayı verir.

Geriye uyumluluk
[değiştir]
const char* string::c_str(void)

Sadece char* parametre alan C/C++ işlevleri ile geriye dönük uyumluluğu sağlayabilmek için dizgilerin string::c_str() üye işlevini kullanabilirsiniz. string::c_str() geçici bir const char* dizgi döndürür böylelikle bunu bir işleve geçebilirsiniz.

Dizgileri Biçimlendirme

[değiştir]

Dizgiler diğer dizgilere eklenebilir ama diğer sayılara ya da veri türlerine eklenemez. Bu yüzden std::string("Birsey") + 5 gibi bir ifade içeriği "Birsey5" olan bir dizgi oluşturmaz. Diğer veri türlerini dizgi türüne çevirmek için <sstream> başlık dosyasında bulunan std::ostringstream sınıfını kullanabiliriz. std::ostringstream 'in çalışma mantığı aynen std::cout gibidir, tek farkla ki çıktı işletim sistemi tarafından sağlanan standart çıktı yerine, dahili bir arabelleğe gider. Daha sonra arabellekteki bu bilgiler std::ostringstream::str() yöntemiyle dizgi türüne std::string çevrilebilir.

Örnek

[değiştir]
 #include <ostream>
 #include <sstream>
 #include <string>
 #include <iostream>
 
 using namespace std;
 
 int main ()
 {
   ostringstream cikis;
   /* std::ostringstream'i std::cout ya da diğer
    * çıkış akımları gibi kulllanıyoruz */
   cikis << "Gelen kutunuzda: " << 5 << " tane mesajınız var";
   /* std::ostringstream'i bir dizgiye dönüştürüyoruz */
   string yazi = cikis.str ();
   cout << yazi << '\n';
   return 0;
 }