Yazılım geliştirme sürecinde isimler, adresler, şifreler veya uzun paragraflar gibi metin tabanlı verilerle çalışmak programlamanın en temel ihtiyaçlarından biridir. Bilgisayar bilimlerinde bir metin (string), karakterlerin ardışık olarak sıralandığı bir dizidir.
Eski C dilinde metinler, sonu her zaman null ('\0') karakteriyle biten karakter dizileri (C-style strings) olarak tutulurdu. Ancak bu geleneksel C-metinleri üzerinde kopyalama, birleştirme veya uzunluk bulma gibi işlemler yapmak hem oldukça karmaşık hem de bellek yönetimi açısından verimsizdi. Modern ANSI standart C++ dili, bu eski yöntemlerin eksikliklerini gidermek için string adında yepyeni, güvenli ve nesne yönelimli (object-oriented) bir sınıf (class) sunar.
Web sitemizin bu rehberinde, C++ dilinde metinlerin (string) nasıl oluşturulduğunu, kullanıcıdan nasıl alındığını ve bir metin üzerinde arama, birleştirme, değiştirme gibi string işlemlerinin nasıl yapıldığını detaylı kod örnekleriyle, sıfırdan öğrenenler için inceleyeceğiz.
1. C++’ta String Sınıfını (Class) Projeye Dahil Etmek
C++’ta modern string sınıfını kullanabilmek ve metinler üzerinde işlem yapabilmek için programımızın en başına <string> başlık dosyasını (header) eklememiz gerekir.
string sınıfı, Standart Şablon Kütüphanesi’nin (STL) bir parçası olarak kabul edildiği için, bu sınıfa ait fonksiyonlar ve araçlar std isim alanı (namespace) içinde yer alır.
2. String Nesneleri Oluşturma ve Değer Atama
string sınıfı, metin nesneleri oluşturmak için bize birçok farklı kurucu fonksiyon (constructor) sunar. Bir metni boş olarak başlatabilir, doğrudan bir metin atayabilir veya başka bir metnin kopyasını oluşturabiliriz.
Örnek Kullanım:
#include <iostream>
#include <string> // String işlemleri için kütüphaneyi dahil ediyoruz
using namespace std;
int main() {
// 1. Boş bir string nesnesi oluşturma
string s1;
// 2. Başlangıç değeri vererek (string constant) oluşturma
string s2("Merhaba");
// 3. Başka bir string'den kopya (copy constructor) oluşturma
string s3(s2);
// 4. Atama operatörü (=) ile değer verme
string s4 = "C++ Dünyası";
cout << s2 << " " << s4 << endl; // Çıktı: Merhaba C++ Dünyası
return 0;
}
3. Kullanıcıdan Metin (String) Okumak: cin vs getline
Kullanıcıdan bir metin almak istediğimizde aşina olduğumuz cin >> operatörünü kullanabiliriz. Ancak burada çok kritik bir detay vardır: cin >> operatörü klavyeden girilen metni okurken ilk boşluk (space) veya satır sonu (enter) karakterini gördüğü anda okumayı durdurur. Yani kullanıcı “Ahmet Yılmaz” yazarsa, cin sadece “Ahmet” kısmını okur.
Eğer kullanıcının girdiği cümlenin tamamını, aradaki boşluklarla (embedded blanks) birlikte okumak istiyorsak getline() fonksiyonunu kullanmalıyız.
#include <iostream>
#include <string>
using namespace std;
int main() {
string tamAd;
cout << "Lutfen adinizi ve soyadinizi girin: ";
// cin >> tamAd; // SADECE İLK KELİMEYİ OKUR! YANLIŞ KULLANIM.
getline(cin, tamAd); // TÜM SATIRI BOŞLUKLARIYLA BİRLİKTE OKUR.
cout << "Hos geldin, " << tamAd << "!" << endl;
return 0;
}
4. Metinleri Birleştirme (Concatenation)
İki veya daha fazla metni uç uca eklemek (birleştirmek) C++ string sınıfı ile adeta matematiksel bir toplama işlemi kadar basittir. C++ dilinde + operatörü, iki string nesnesini birleştirmek için aşırı yüklenmiştir (overloaded). Ayrıca mevcut bir metnin sonuna ekleme yapmak için += operatörü veya append() fonksiyonu kullanılabilir.
#include <iostream>
#include <string>
using namespace std;
int main() {
string ad = "Yapay";
string soyad = "Zeka";
// + operatörü ile birleştirme
string tamIsim = ad + " " + soyad; // Sonuç: "Yapay Zeka"
// += operatörü ile sonuna ekleme
string mesaj = "Ogrenmeye ";
mesaj += "Basla!"; // Sonuç: "Ogrenmeye Basla!"
// append() fonksiyonu ile ekleme
mesaj.append(" Hemen simdi.");
cout << tamIsim << endl;
cout << mesaj << endl;
return 0;
}
5. String Özellikleri: Uzunluk ve Kapasite
Bir metnin kaç karakterden oluştuğunu bilmek, döngüler kurarken veya veri doğrularken çok önemlidir. string sınıfı, metnin özelliklerini öğrenmemiz için bize size(), length(), capacity() ve empty() gibi fonksiyonlar sunar.
length()vesize(): Bir string nesnesinin içerisinde şu anda saklanan karakter sayısını (uzunluğunu) verir. Her ikisi de aynı işlevi görür.capacity(): String nesnesi için bellekte ayrılmış olan toplam kapasiteyi belirtir. Bir metin uzadıkça bu kapasite otomatik olarak artırılır.empty(): Eğer metnin içi tamamen boşsa (uzunluğu 0 ise)true, değilsefalsedöndürür.
string sifre = "12345678";
cout << "Sifre uzunlugu: " << sifre.length() << " karakter." << endl;
if(sifre.empty()) {
cout << "Sifre bos birakilamaz!" << endl;
}
6. Karakterlere ve Alt Metinlere (Substring) Erişim
Bir metnin içindeki spesifik bir karaktere ulaşmak için iki yöntem vardır: Köşeli parantez [] operatörü veya at() üye fonksiyonu. Metindeki karakterlerin indeks numarası her zaman 0‘dan başlar.
Ayrıca, uzun bir metnin sadece belirli bir bölümünü kopyalayıp almak için substr() fonksiyonu kullanılır. substr(başlangıç_indeksi, uzunluk) şeklinde iki parametre alır.
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "C++ Programlama Dili";
// İlk karaktere erişim (İndeks 0)
cout << "Ilk harf: " << s << endl; // 'C'
cout << "Dorduncu harf: " << s.at(4) << endl; // 'P'
// Alt metin (Substring) çıkarma
// 4. indeksten başla ve 11 karakter al
string altMetin = s.substr(4, 11);
cout << "Cikarilan kelime: " << altMetin << endl; // Çıktı: "Programlama"
return 0;
}
7. Metin İçinde Arama Yapmak (Find İşlemleri)
Bir string içerisinde belirli bir harfi veya kelimeyi aramak için find() fonksiyonu kullanılır. Aranılan ifade bulunursa, metnin başlangıç indeks numarasını döndürür. Ayrıca ilk eşleşmeyi bulmak için find_first_of(), son eşleşmeyi bulmak için find_last_of() fonksiyonları mevcuttur.
string cumle = "Bugun hava cok guzel, yarin da guzel olacak.";
int pozisyon = cumle.find("guzel");
if(pozisyon != string::npos) {
cout << "'guzel' kelimesi " << pozisyon << ". indekste bulundu." << endl;
} else {
cout << "Kelime bulunamadi." << endl;
}
(Not: string::npos, find fonksiyonunun aranan ifadeyi bulamadığında döndürdüğü özel bir sabittir.)
8. Metinleri Değiştirme (Modifying Strings)
string nesnelerinin içeriklerini sonradan değiştirebiliriz. Bunun için insert() (araya karakter ekleme), erase() (karakter silme) ve replace() (karakter değiştirme) fonksiyonları kullanılır.
#include <iostream>
#include <string>
using namespace std;
int main() {
string metin = "Benim adim John.";
// 1. insert() -> Belirtilen indekse metin ekler
metin.insert(11, "isim ");
// metin artık: "Benim adim isim John." oldu.
// 2. erase() -> Belirtilen indeksten itibaren N karakter siler
metin.erase(11, 5);
// "isim " kelimesini sildik, orijinal metne döndü.
// 3. replace() -> Bir kısmı başka bir metinle değiştirir
// 11. indeksten başla, 4 karakteri sil ve yerine "Ahmet" yaz
metin.replace(11, 4, "Ahmet");
cout << metin << endl; // Çıktı: "Benim adim Ahmet."
return 0;
}
9. Metinleri Karşılaştırma (Compare) ve Takas Etme (Swap)
İki metni alfabetik (sözlüksel) olarak karşılaştırmak için ==, !=, <, > gibi ilişkisel operatörleri (relational operators) doğrudan kullanabiliriz. İki metnin birbirinin tamamen aynısı olup olmadığını kontrol etmek if(s1 == s2) yazmak kadar basittir.
Daha karmaşık işlemler veya metnin sadece bir kısmını karşılaştırmak için compare() fonksiyonu kullanılır. compare() fonksiyonu, iki metin eşitse 0, çağıran metin alfabetik olarak daha büyükse pozitif bir sayı, küçükse negatif bir sayı döndürür.
İki string nesnesinin içeriklerini birbiriyle yer değiştirmek (takas etmek) için ise swap() fonksiyonu kullanılır.
string s1 = "Elma";
string s2 = "Armut";
// İçerik takası (swap)
s1.swap(s2); // Artık s1="Armut", s2="Elma" oldu.
// Karşılaştırma
if(s1 == s2) {
cout << "Kelimeler ayni." << endl;
} else if (s1.compare(s2) > 0) {
cout << s1 << " kelimesi alfabetik olarak " << s2 << " kelimesinden sonra gelir." << endl;
}
Özet
C++ programlama dilinde eski nesil C-metinlerinden kurtulup modern string sınıfını kullanmak, yazılım geliştirme süreçlerinde kod güvenliğini ve verimliliğini inanılmaz derecede artırır. getline() ile kullanıcıdan güvenli metin okumak, + operatörüyle kolayca metin birleştirmek ve find(), replace(), substr() gibi yerleşik fonksiyonlar sayesinde metin veri tabanlarını manipüle etmek C++ dilini güçlü kılan unsurlardan biridir. Sitemizde yer alan bu kod bloklarını kendi IDE (geliştirme ortamınız) üzerinde derleyip farklı metinlerle deneyerek bu konuyu kalıcı bir şekilde öğrenebilirsiniz. İyi kodlamalar!





