Kategoriler
C/C++

C++ Dize (String) ve Kütüphanesi

C++ da dize (string) işlemlerinin bir çoğu string kütüphanesi içerisindeki fonksiyonlar yardımıyla gerçekleştirilir. Bu yüzden programınızda karakter dizilerini kullanacaksanız string kütüphanesi işinizi kolaylaştıracak bazı kullanışlı fonksiyonlar sunar.

Elbette tek bir içerikte tüm fonksiyon ve metotları anlatamayacağım ancak en çok kullanılanları, bir kaç küçük kod örneği ile kullanımını tarif edeceğim. 🙂 Umarım işinize yarar.

#include <string>

Dizelere ekleme yapmak;

#include <iostream>
#include <string>
using namespace std;
int main(){
    string fullName, firstName, lastName;
    firstName = "Muhammet";
    lastName = "ŞAFAK";
    fullName = firstName + " " + lastName;
    cout<<fullName<<endl;
    return 0;
}

bu şu şekilde bir çıktı üretir;

Muhammet ŞAFAK

append() Metodu

Parametre olarak aldığı dizeyi ilgili dizenin sonuna ekler. Aslında “+” ile aynı işi yapsa da append() metodunun daha hızlı çalıştığı bir çok makalede vurgulanmıştır.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string fullName, firstName, lastName;
    firstName = "Muhammet ";
    lastName = "ŞAFAK";
    fullName = firstName.append(lastName);
    cout<<fullName<<endl;
    return 0;
}

length() ve ya size() Metodu

Bir dizenin karakter uzunluğunu ölçmek için length() metodu kullanılır. Dize boyutunu ölçmek için size() metodu kullanan bazı kodlarda görebilirsiniz. size() metodu length() metodunun takma adıdır ve arka planda yine length() metodunu çalıştırır.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string fullName, firstName, lastName;
    firstName = "Muhammet ";
    lastName = "ŞAFAK";
    fullName = firstName.append(lastName);
    int fN_size = fullName.size();
    int fN_length = fullName.length();
    cout<<"fullName değişkeni : "<<fN_size<<" karakterdir. (size)"<<endl;
    cout<<"fullName değişkeni : "<<fN_length<<" karakterdir. (length)"<<endl;
    return 0;
}

aşağıdaki gibi çıktı üretir;

fullName değişkeni : 15 karakterdir. (size)
fullName değişkeni : 15 karakterdir. (length)

getline() Fonksiyonu

Kullanıcıdan dize (string) türündeki veri girişleri almak için kullanılır. Normalde kullanıcıdan bir girdi almak için iostream kütüphanesi altındaki cin işlemcisi kullanılsa da iş dizelere geldiğinde bu işlemci özellikle boşluk karakterinden dolayı sorun yaşıyor.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string fullName;
    getline(cin, fullName);
    cout<<fullName<<endl;
    return 0;
}

clear() Metodu

İlgili string değişkeninin içerisini boşaltır.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str, input;
    cout<<"Bir kaç satır metin girin. Bitirmek için nokta (.) kullanın."<<endl;
    do{
        input = cin.get();
        str += input;
        if(input == "\n"){
            cout<<str;
            str.clear();
        }
    }while(input != ".");
    return 0;
}

begin() ve end() Metotları

Bir dizenin başlangıcı ve sonunu bildirir.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string base;
    base = "Hello World";
    for(string::iterator i=base.begin(); i != base.end(); ++i){
        cout << *i << endl;
    }

    return 0;
}

assign() Metodu

String bir değişkene veri ataması yapmak için kullanılır.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str, base;
    base = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";

    str.assign(base);
    cout<<str<<endl;

    str.assign(base, 10, 9);
    cout<<str<<endl; //"m dolor s"

    str.assign("Hello World", 7);
    cout<<str<<endl; //"Hello W"

    str.assign(10, '*');
    cout<<str<<endl; //"**********"

    str.assign(base.begin()+6, base.end()-15);
    cout<<str<<endl; //"ipsum dolor sit amet, consectetur a"

    return 0;
}

insert() Metodu

Bir dize içerisinde bir yere farklı bir dize eklemek için kullanılır.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str="to be question";
    string str2="the ";
    string str3="or not to be";
    string::iterator it;

    // used in the same order as described above:
    str.insert(6,str2);                 // to be (the )question
    str.insert(6,str3,3,4);             // to be (not )the question
    str.insert(10,"that is cool",8);    // to be not (that is )the question
    str.insert(10,"to be ");            // to be not (to be )that is the question
    str.insert(15,1,':');               // to be not to be(:) that is the question
    it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
    str.insert (str.end(),3,'.');       // to be, not to be: that is the question(...)
    str.insert (it+2,str3.begin(),str3.begin()+3); // (or )

    cout << str << endl;

    return 0;
}

erase() Metodu

Dizenin belirtilen bölümünü silmek için kullanılır.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str="Merhaba, C++ mükemmel bir dil.";
    cout<<str<<endl;

    str.erase(10, 2);
    cout<<str<<endl; //"Merhaba, C mükkemmel bir dil."

    str.erase(str.begin() + 21, str.end() - 4);
    cout<<str<<endl; //"Merhaba, C mükemmel dil."

    return 0;
}

resize() Metodu

Bir dizenin boyutunu (uzunluğunu) değiştirir.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str="Hello World";
    cout<<str<<endl;

    str.resize(16, '-');
    cout<<str<<endl; //"Hello World-----"

    str.resize(5);
    cout<<str<<endl; //"Hello"

    return 0;
}

replace() Metodu

Dizenin belli bir bölümünü değiştirmeyi sağlar.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string base="this is a test string.";
    string str2="n example";
    string str3="sample phrase";
    string str4="useful.";

    // replace signatures used in the same order as described above:

    // Using positions:                 0123456789*123456789*12345
    string str=base;           // "this is a test string."
    str.replace(9,5,str2);          // "this is an example string." (1)
    str.replace(19,6,str3,7,6);     // "this is an example phrase." (2)
    str.replace(8,10,"just a");     // "this is just a phrase."     (3)
    str.replace(8,6,"a shorty",7);  // "this is a short phrase."    (4)
    str.replace(22,1,3,'!');        // "this is a short phrase!!!"  (5)

    // Using iterators:                                               0123456789*123456789*
    str.replace(str.begin(),str.end()-3,str3);                    // "sample phrase!!!"      (1)
    str.replace(str.begin(),str.begin()+6,"replace");             // "replace phrase!!!"     (3)
    str.replace(str.begin()+8,str.begin()+14,"is coolness",7);    // "replace is cool!!!"    (4)
    str.replace(str.begin()+12,str.end()-4,4,'o');                // "replace is cooool!!!"  (5)
    str.replace(str.begin()+11,str.end(),str4.begin(),str4.end());// "replace is useful."    (6)
    cout << str << endl;
    return 0;
}

pop_back() Metodu

Dizenin son karakterini siler.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str = "Hello World!";
    cout<<str<<endl;
    str.pop_back();
    cout<<str<<endl;
    return 0;
}

compare() Metodu

Dize içinde karşılaştırma yapmayı sağlar.

#include <iostream>
#include <string>
using namespace std;
int main(){
    string str1 = "kirmizi elma";
    string str2 = "yesil elma";

    if(str1.compare(str2) != 0){
        cout<<"str1 ile str2"<<" aynı değildir"<<endl;
    }
    if(str2.compare(6, 4, "elma") == 0){
        cout<<"str2 6. karakterden sonra 4 karakter elma'dır."<<endl;
    }

    if(str1.compare(str1.size()-4, 4, "elma") == 0){
        cout<<"str1 elma ile bitiyor."<<endl;
    }

    if(str1.compare(str1.size()-4, 4, str2, str2.size()-4, 4) == 0){
        cout<<"str1 ve str2 son 4 karakteri aynıdır."<<endl;
    }

    return 0;
}

yukarıdaki kod aşağıdaki şekilde çıktı üretecektir.

str1 ile str2 aynı değildir
str2 6. karakterden sonra 4 karakter elma'dır.
str1 elma ile bitiyor.
str1 ve str2 son 4 karakteri aynıdır.

copy() Metodu

Bir dizenin belli bir bölümünü başka bir karakter dizisinin içerisine kopyalar…

#include <iostream>
#include <string>
using namespace std;
int main(){

    char str2[10];
    string str1 = "Hello World, I'm C++.";

    size_t length = str1.copy(str2, 7, 13);
    str2[length] = '\0';
    cout<<str2<<endl; //"I'm C++"

    return 0;
}

find() Metodu

Dize içerisinde arama yapmak için kullanılır. Aranılan bulunursa başlangıç indexsini verir.

#include <iostream>
#include <string>
using namespace std;
int main(){

    string str = "Hello World, I'm C++.";
    string search = "I'm";

    size_t found = str.find(search);
    if(found!=string::npos){
        cout<<"Bulundu : "<<found<<endl;
    }else{
        cout<<"bulunamadı..."<<endl;
    }
    found = str.find("I'm C", found, 5);
    if(found != string::npos){
        cout<<"I'm C; str index : "<<found<<endl;
    }

    return 0;
}

find() metodu dize içerisinde aramayı soldan sağa yapar. Sağdan sola arama işlemi gerçekleştirmek için rfind() metodunu kullanın.

#include <iostream>
#include <string>
using namespace std;
int main(){

    string str = "Hello World, I love C++.";
    string search = "C++";

    size_t found = str.rfind(search);
    if(found!=string::npos){
        str.replace(found, search.size(), "PHP");
    }
    cout<<str<<endl;
    return 0;
}

substr() Metodu

Dizinin belirli bir bölümünü kırpmak/kesmek için kullanılır.

#include <iostream>
#include <string>
using namespace std;
int main(){

    string str = "Hello World, I like C++.";

    string str2 = str.substr(13, 8); //"I like C"
    size_t pos = str.find("like");
    string str3 = str.substr(pos); //"like C++."

    cout<<str2<<endl<<str3<<endl;
    return 0;
}

isupper() ve islower() Fonksiyonları

Bir karakterin büyük harf mi küçük harf mi olduğunu öğrenmek için kullanılır.

#include <iostream>
#include <string>
using namespace std;

int main(){
    char c;
    string str;
    int i = 0;
    str = "Hello World!";
    while(str[i]){
        c = str[i];
        if(islower(c)){
            cout<<c<<" küçük karakterdir."<<endl;
        }else if(isupper(c)){
            cout<<c<<" büyük karakteridir."<<endl;
        }else{
            cout<<c<<" alfabetik bir değer değildir."<<endl;
        }
        ++i;
    }
    return 0;
}

Upper ve Lower İşlemleri

C++ ile bir karakter dizisinin tüm karakterlerini büyük harfe çevirmek için dahili bir metot ya da fonksiyona sahip değildir. Bunun yerine karakterleri bir döngüye sokarak büyütme/küçültme işlemini tek tek yapmanız gerekir.

toupper()

#include <iostream>
#include <string>
using namespace std;
int main(){

    string str;
    int i;

    str = "Hello World, I like C++.";
    i = 0;
    while(str[i]){
        str[i] = toupper(str[i]);
        ++i;
    }
    
    cout<<str<<endl; //"HELLO WORLD, I LIKE C++."
    return 0;
}

tolower()

#include <iostream>
#include <string>
using namespace std;
int main(){

    string str;
    int i;

    str = "Hello World, I like C++.";
    i = 0;
    while(str[i]){
        str[i] = toupper(str[i]);
        ++i;
    }
    
    cout<<str<<endl; //"hello world, i like c++."
    return 0;
}

Bu işlemi bir kez yaptığınızda büyük bir sorun teşkil etmez ancak bunu yüzlerce farklı yerde kullanmanız gerekirse; işte o zaman işler içinden çıkmaz bir hale gelir. Bunu kendiniz bir fonksiyon haline getirip kullanmak son derece mantıklı bir çözüm olacaktır.

Bu işlemi gerçekleştirecek iki küçük fonksiyonu aşağıdan alıp kullanabilirsiniz.

#include <string>
using namespace std;
string strtolower(string &str){
    int i = 0;
    while(str[i]){
        str[i] = tolower(str[i]);
        ++i;
    }
    return str;
}

string strtoupper(string &str){
    int i = 0;
    while(str[i]){
        str[i] = toupper(str[i]);
        ++i;
    }
    return str;
}

fonksiyonları uygun şekilde oluşturduktan sonra artık aşağıdaki şekilde kullanabilmelisiniz.

int main(){
    string str;
    str = "Hello World, I like C++.";
    cout<<strtolower(str)<<endl;
    cout<<strtoupper(str)<<endl;
    return 0;
}

Bir Cevap Yazın