# 1.8 C++ Stringleri (C++ Strings)

C++ dilinde stringler, metin verilerini saklamak için kullanılan veri türleridir. C++'da stringlerle çalışmanın iki ana yolu vardır:

* **C-Style Stringler (C-İçin Stringler)**
* **`std::string` Sınıfı**

## `std::string` Sınıfı

`std::string`, C++ Standart Kütüphanesi'nin bir parçasıdır ve dinamik olarak büyüyebilen, kolay yönetilebilen ve çok sayıda kullanışlı fonksiyon sunan bir sınıftır.

**Örnek:**

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

int main() {
    string greeting = "Merhaba, Dünya!";
    cout << greeting << endl;
    return 0;
}
```

> string sınıfını kullanmak için \<string> kütüphanesinin eklenmesi gerekiyor.

## String Birleştirme

String birleştirme, iki veya daha fazla stringi bir araya getirmek için kullanılır. C++'da `std::string` sınıfı, `+` ve `+=`operatörleri ile string birleştirmeyi kolaylaştırır.

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

int main() {
    string firstName = "Hüseyin";
    string lastName = "Tazegül";
    string fullName = firstName + " " + lastName; // "Hüseyin Tazegül"

    cout << "Tam İsim: " << fullName << endl;
    return 0;
}
```

**`+=` Operatörü ile Birleştirme**

```
string greeting = "Merhaba";
greeting += ", Dünya!"; // "Merhaba, Dünya!"
cout << greeting << endl;
```

## Sayılar ve Stringler

C++'da sayılar ile stringler arasında dönüşüm yapmak sıkça gereklidir. Örneğin, bir sayıyı stringe çevirmek veya bir stringi sayıya çevirmek isteyebilirsiniz.

**Sayıyı Stringe Çevirme (`to_string`)**

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

int main() {
    int number = 42;
    string strNumber = to_string(number);
    cout << "Sayı: " << number << ", String: " << strNumber << endl;
    return 0;
}
```

**Stringi Sayıya Çevirme (`stoi`, `stof`, `stod`)**

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

int main() {
    string str = "12345";
    int number = stoi(str); // Stringi integer'a çevirir
    cout << "String: " << str << ", Sayı: " << number << endl;

    string floatStr = "3.14";
    float floatNumber = stof(floatStr); // Stringi float'a çevirir
    cout << "String: " << floatStr << ", Float Sayı: " << floatNumber << endl;

    string doubleStr = "2.71828";
    double doubleNumber = stod(doubleStr); // Stringi double'a çevirir
    cout << "String: " << doubleStr << ", Double Sayı: " << doubleNumber << endl;

    return 0;
}
```

## **String Uzunluğu**

Bir stringin uzunluğunu bulmak için `length()` veya `size()` fonksiyonları kullanılır. Her iki fonksiyon da aynı sonucu verir ve stringdeki karakter sayısını döndürür.

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

int main() {
    string message = "Merhaba, Dünya!";
    cout << "Mesaj uzunluğu: " << message.length() << endl; // 15
    cout << "Mesaj uzunluğu (size): " << message.size() << endl; // 15
    return 0;
}
```

## Stringlere Erişim

Stringler içerisindeki karakterlere erişmek için köşeli parantez (`[]`) veya `at()` fonksiyonu kullanılır. `[]` operatörü hızlı erişim sağlar ancak sınır kontrolleri yapmaz. `at()` fonksiyonu ise sınır kontrolleri yapar ve hatalı erişimlerde istisna fırlatır.

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

int main() {
    string word = "C++";

    // Köşeli parantez ile erişim
    cout << "İlk karakter: " << word[0] << endl; // 'C'

    // at() fonksiyonu ile erişim
    cout << "İkinci karakter: " << word.at(1) << endl; // '+'

    // Karakter değiştirme
    word[1] = '+';
    cout << "Değiştirilmiş kelime: " << word << endl; // "C++"

    return 0;
}
```

## Özel Karakterler

Stringlerde özel karakterler kullanmak için kaçış karakterleri (`\`) kullanılır. Bu karakterler, yazılması zor veya doğrudan yazılamayan karakterleri temsil eder.

#### Yaygın Kaçış Karakterleri:

* : Yeni satır
* : Sekme
* `\\` : Ters eğik çizgi
* `\"` : Çift tırnak
* `\'` : Tek tırnak

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

int main() {
    string text = "Merhaba,\n\tDünya!";
    cout << text << endl;

    string path = "C:\\Program Files\\C++";
    cout << "Dosya Yolu: " << path << endl;

    string quote = "Hüseyin \"C++\" öğreniyor.";
    cout << quote << endl;

    return 0;
}
```

**Çıktı:**

```
Merhaba,
	Dünya!
Dosya Yolu: C:\Program Files\C++
Hüseyin "C++" öğreniyor.
```

## Kullanıcı Girişi ile Stringler

Kullanıcıdan string girişi almak için `cin` veya `getline()` fonksiyonları kullanılır. `cin`, ilk boşluk karakterine kadar olan kısmı alırken, `getline()` tüm satırı alır (boşluklar dahil).

**`cin` ile Kullanıcı Girişi**

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

int main() {
    string name;
    cout << "Adınızı girin: ";
    cin >> name; // İlk boşluğa kadar olan kısmı alır
    cout << "Merhaba, " << name << "!" << endl;
    return 0;
}
```

**`getline()` ile Kullanıcı Girişi**

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

int main() {
    string fullName;
    cout << "Tam isminizi girin: ";
    getline(cin, fullName); // Tüm satırı alır (boşluklar dahil)
    cout << "Girdiginiz isim: " << fullName << endl;
    return 0;
}
```

**Çoklu Girdi Alma**

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

int main() {
    string firstName, lastName;
    int age;

    cout << "İlk adınızı girin: ";
    cin >> firstName;

    cout << "Soyadınızı girin: ";
    cin >> lastName;

    cout << "Yaşınızı girin: ";
    cin >> age;

    cout << "Merhaba, " << firstName << " " << lastName << "! " << age << " yaşındasınız." << endl;
    return 0;
}
```

## String Namespace

`std::string` sınıfı, C++ Standart Kütüphanesi'nin `std` namespace'i altında tanımlanmıştır. `std` namespace'i, standart kütüphane elemanlarını kapsar ve isim çakışmalarını önlemek için kullanılır.

#### Kullanım Yöntemleri:

* **Namespace Kapsayıcıları Kullanarak:**

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

int main() {
    string message = "Hello, World!";
    cout << message << endl;
    return 0;
}
```

* `std::` Önekini Kullanarak:

```
#include <iostream>
#include <string>

int main() {
    std::string message = "Hello, World!";
    std::cout << message << std::endl;
    return 0;
}
```

**`using` Anahtar Kelimesi ile Namespace Kullanımı**

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

int main() {
    string greeting = "Merhaba";
    cout << greeting << ", Dünya!" << endl;
    return 0;
}
```

**Namespace Alias (Takma Ad) Kullanımı**

```
#include <iostream>
#include <string>
namespace geo = std;

int main() {
    geo::string location = "İstanbul";
    geo::cout << "Lokasyon: " << location << geo::endl;
    return 0;
}
```

## C-Style Stringler

C-Style stringler, karakter dizilerini `char` dizileri olarak temsil eder ve null karakter (`'\0'`) ile sonlandırılır. Bu yöntem, C dilinden miras alınmıştır ve C++'da da kullanılabilir.

#### Özellikler:

* Sabit veya dinamik boyutlu olabilir.
* Standart kütüphane fonksiyonları (`<cstring>`) ile işlenir.
* Daha düşük seviyeli kontrol sağlar ancak hata yapma olasılığı yüksektir.

#### Örnek Kullanım:

```
#include <iostream>
#include <cstring> // C-Style string fonksiyonları için gerekli
using namespace std;

int main() {
    // C-Style string tanımlama
    char greeting1[] = "Merhaba";
    char greeting2[20]; // Boş bir karakter dizisi

    // Kopyalama işlemi
    strcpy(greeting2, greeting1);
    cout << "Greeting2: " << greeting2 << endl;

    // Birleştirme işlemi
    strcat(greeting2, " Dünya!");
    cout << "Birleştirilmiş Greeting2: " << greeting2 << endl;

    // Karakter sayısını bulma
    int length = strlen(greeting2);
    cout << "Greeting2'nin uzunluğu: " << length << endl;

    return 0;
}
```

#### Yaygın Fonksiyonlar:

* `strcpy(dest, src)`: `src` stringini `dest` stringine kopyalar.
* `strcat(dest, src)`: `src` stringini `dest` stringinin sonuna ekler.
* `strlen(str)`: `str` stringinin uzunluğunu döndürür.
* `strcmp(str1, str2)`: `str1` ve `str2` stringlerini karşılaştırır.

#### Güvenlik Notları:

C-Style stringler kullanırken, buffer overflow gibi hatalara dikkat etmek gerekir. `strncpy` ve `strncat` gibi sınırlandırılmış fonksiyonlar kullanarak güvenliği artırabilirsiniz.

#### Örnek Güvenli Kopyalama:

```
#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char src[] = "Güvenli Kopyalama";
    char dest[25];

    // strncpy kullanarak güvenli kopyalama
    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0'; // Null terminator ekleme

    cout << "Kaynak: " << src << endl;
    cout << "Hedef: " << dest << endl;

    return 0;
}
```
