C++ String İşlemleri: C-Style ve std::string
C++’ta C-Style stringler ve std::string kullanımını öğrenin. Metin işleme, birleştirme ve karakter işlemleri örneklerle anlatılıyor.
C++ dilinde metin (string) işlemleri hem klasik C tarzı karakter dizileri (char array) ile
hem de modern std::string sınıfı ile yapılabilir.
C tarzı diziler düşük seviyeli kontrol sunarken, std::string sınıfı daha güvenli ve kullanışlıdır.
Bu makalede metinlerle çalışmanın tüm yönlerini detaylı biçimde öğreneceğiz.
1. C-Style String (char dizileri)
C tarzı stringler, null karakteri ('\0') ile sonlandırılan char dizileridir.
Bellekte düz bir karakter dizisi olarak saklanırlar.
#include <iostream>
using namespace std;
int main() {
char mesaj1[] = "Merhaba"; // Otomatik olarak '\0' eklenir
char mesaj2[20] = "C++"; // Maksimum 19 karakter + '\0'
cout << mesaj1 << " " << mesaj2 << endl;
return 0;
}
C-style stringlerle çalışırken dikkat edilmesi gereken en önemli şey, karakter dizisinin sınırını aşmamaktır. Çünkü C++ bu tür dizilerde otomatik sınır kontrolü yapmaz.
2. strcpy, strcat, strlen, strcmp (C String Fonksiyonları)
C tarzı dizilerle çalışırken <cstring> kütüphanesindeki fonksiyonlar kullanılır:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a[20] = "C++";
char b[20] = "Programlama";
// Birleştirme
strcat(a, " "); // a = "C++ "
strcat(a, b); // a = "C++ Programlama"
// Kopyalama
char c[20];
strcpy(c, a);
// Uzunluk
cout << "Uzunluk: " << strlen(a) << endl;
// Karşılaştırma
if (strcmp(a, c) == 0)
cout << "A ve C eşit." << endl;
cout << "Sonuç: " << a << endl;
}
Bu fonksiyonlar dikkatli kullanılmalıdır çünkü taşma (buffer overflow) riski vardır.
Modern C++’ta bunun yerine std::string kullanmak önerilir.
3. std::string Sınıfına Giriş
Modern C++’ta metinlerle çalışmak için <string> kütüphanesi kullanılır.
std::string dinamik olarak büyüyebilir, otomatik bellek yönetimi yapar ve zengin fonksiyonlara sahiptir.
#include <iostream>
#include <string>
using namespace std;
int main() {
string ad = "Ali";
string soyad = "Yılmaz";
string tamAd = ad + " " + soyad;
cout << "Merhaba " << tamAd << endl;
return 0;
}
std::string türü + operatörüyle kolayca birleştirilebilir
ve == ile doğrudan karşılaştırılabilir.
4. Temel String İşlemleri
| İşlem | Açıklama | Örnek |
|---|---|---|
| Birleştirme | İki string’i birleştirir | a + b |
| Uzunluk | Karakter sayısını döndürür | a.length() veya a.size() |
| Karaktere erişim | İndeksle erişim | a[0], a.at(2) |
| Alt string | Parça alma | a.substr(2, 4) |
| Karşılaştırma | Alfabetik karşılaştırma | a.compare(b) |
| Boş mu? | String boş mu kontrolü | a.empty() |
| Temizleme | İçeriği siler | a.clear() |
string metin = "Programlama";
cout << metin.length() << endl; // 12
cout << metin.substr(0, 7) << endl; // "Program"
5. Arama, Değiştirme ve Silme İşlemleri
std::string birçok güçlü metin işleme fonksiyonuna sahiptir:
string mesaj = "C++ programlama dili";
// Arama
size_t konum = mesaj.find("programlama");
if (konum != string::npos)
cout << "'programlama' bulundu, indeks: " << konum << endl;
// Değiştirme
mesaj.replace(4, 11, "modern"); // 4. indexten itibaren 11 karakter değiştir
cout << mesaj << endl; // "C++ modern dili"
// Silme
mesaj.erase(4, 7); // 4. indexten itibaren 7 karakter sil
cout << mesaj << endl; // "C++ dili"
find() aranan metni bulamazsa string::npos döndürür.
Bu değer “bulunamadı” anlamına gelir.
6. Karakter Düzeyinde İşlemler
Bir string aslında karakterlerden oluştuğu için döngülerle karakter karakter işlenebilir.
#include <iostream>
#include <string>
using namespace std;
int main() {
string kelime = "Cplusplus";
for (char c : kelime) {
cout << c << " ";
}
cout << endl;
// Büyük harfe dönüştürme
for (char &c : kelime) {
c = toupper(c);
}
cout << kelime << endl;
}
Karakter dönüşümleri için <cctype> kütüphanesindeki
toupper() ve tolower() fonksiyonları kullanılabilir.
7. Dönüştürme İşlemleri (string <→ int, double)
std::string sayısal değerlere dönüştürülebilir veya tersi yapılabilir.
#include <iostream>
#include <string>
using namespace std;
int main() {
string sayiMetni = "42";
int sayi = stoi(sayiMetni); // string → int
double d = stod("3.14"); // string → double
cout << sayi + 10 << endl; // 52
cout << d * 2 << endl; // 6.28
// int → string
int yas = 25;
string yazi = to_string(yas);
cout << "Yaş: " << yazi << endl;
}
8. Karşılaştırma (compare, ==, <, >)
String’ler hem compare() metodu hem de karşılaştırma operatörleriyle kıyaslanabilir.
string a = "Ali";
string b = "Veli";
if (a == b)
cout << "Eşit" << endl;
else if (a < b)
cout << "A alfabetik olarak önce" << endl;
else
cout << "A alfabetik olarak sonra" << endl;
9. Girdi ve Çıktı İşlemleri
cin sadece ilk boşluk karakterine kadar olan kısmı okur.
Eğer bir cümle tamamını almak istiyorsanız getline() fonksiyonunu kullanmalısınız.
#include <iostream>
#include <string>
using namespace std;
int main() {
string ad;
cout << "Adınızı girin: ";
cin >> ad;
cout << "Merhaba, " << ad << endl;
cin.ignore(); // önceki girişin sonundaki newline karakterini temizle
string cumle;
cout << "Bir cümle girin: ";
getline(cin, cumle);
cout << "Girdiğiniz cümle: " << cumle << endl;
}
getline() boşlukları da dahil ederek tam satırı okur.
10. Örnek Uygulama: Metin Analizi
Aşağıdaki örnekte kullanıcıdan alınan bir metinde kelime ve karakter sayısı bulunur.
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
string metin;
cout << "Bir cümle girin: ";
getline(cin, metin);
int karakterSayisi = 0;
int kelimeSayisi = 1;
for (char c : metin) {
if (isalpha(c))
karakterSayisi++;
if (c == ' ')
kelimeSayisi++;
}
cout << "Karakter sayısı: " << karakterSayisi << endl;
cout << "Kelime sayısı: " << kelimeSayisi << endl;
return 0;
}
11. TL;DR
- C tarzı stringler:
char[]dizileridir, dikkatli kullanılmalıdır. - Modern C++’ta
std::stringsınıfı önerilir. - Temel işlemler:
+,length(),substr(),find(),replace(),erase(). - Sayısal dönüşümler için
stoi(),stod(),to_string()kullanılır. getline()ile boşluk içeren metinler alınabilir.- Tüm örnekler Visual Studio 2022 veya GCC 11+ ortamında çalıştırılabilir.