C++ / Birlikte Yazılım Öğrenelim Serisi - String

YunusEmreOfficial

Online - Çevrimiçi
Premium Üye
Yardımsever Üye
Usta Üye
Mesaj
1.233
Çözümler
35
Beğeni
904
Puan
1.139
Ticaret Puanı
0
Merhaba arkadaşlar,

C++ dilinde string kullanımı hakkında bilgi edinmek isteyenler için bu başlıkta bazı temel kavramları ve özellikleri paylaşmak istiyorum. C++'ta stringler, metin verilerini tutmak için iki ana şekilde temsil edilir: C tarzı stringler ve C++'ın sunduğu std::string sınıfı. Kısaca 2 tarzıda açıklayalım.

C Tarzı Stringler​

C tarzı stringler, karakter dizileri (char dizileri) kullanarak oluşturulur. Bu diziler, '\0' (null karakter) ile sonlanır.

Örnek:​

C:
Genişlet Daralt Kopyala
const char* str = "Merhaba, dünya!";


Özellikleri:
  • Sonlandırma karakteri ('\0')
  • Düşük seviye işlem gerektirir
  • Güvenlik sorunlarına açık olabilir (buffer overflow)

C++'ta std::string​


std::string, C++'ın standart kütüphanesinde yer alan ve metin verileriyle çalışmayı kolaylaştıran bir sınıftır.

Örnek:​

C++:
Genişlet Daralt Kopyala
#include <iostream>
#include <string>

std::string str = "Merhaba, dünya!";
str += " Nasıl gidiyor?";

Bu örnekte string yazısını ve yazının üzerine nasıl yeni değer eklenebileceğini gördük += ifadesini önceki konumuzda açıklamıştık, üzerine verilen değeri ekliyordu dolayısıyla çıktı aşağıdaki gibi olacaktır.

Çıktı :
Merhaba, dünya! Nasıl gidiyor?

Özellikleri:
  • Dinamik bellek yönetimi
  • Kullanıcı dostu ve birçok yerleşik fonksiyon
  • Kolay yazma, birleştirme, kesme ve arama işlemleri
C++'ta string kullanımı, hem C tarzı stringlerle hem de std::string ile mümkündür. Ancak std::string kullanmak genellikle daha güvenli ve kullanışlıdır. Hem yazması kolay hemde özellik olarak C tarzı stringlere göre daha ideal.
 
Son düzenleme:
Bende bir yorum ekleyeyim, C++ ile çalışırken C tarzı herhangi bir şey kullanmaktan kaçının. Dilin isminin C++ olmasının belirli bir sebebi var, daha çok fonksiyon ve geniş yelpaze. C tarzı string bunlardan sadece biri, eğer Metin2 kaynak kodlarına göz atarsanız neredeyse mümkün olan her yerde C tarzı kullanıma başvurulduğunu görebilirsiniz, konuya bir katkım olsun C tarzı kullanılmaması gerekenlerden aklıma gelenleri yazayım;

YANLIŞ:
Bellek yönetimi için C tarzı malloc() ve free() kullanmak.
DOĞRU: Bellek yönetimi için new ve delete kullanmak veya daha iyisi akıllı işaretçiler kullanarak (std::unique_ptr, std::shared_ptr vs.) olası sızıntıların önüne geçmek.

YANLIŞ: short arg[19]; gibi dizi tanımlayıp bunu işaretçilerle kullanmak.
DOĞRU: std::array veya kullanım alanına göre std::vector tarzı konteynerler kullanmak.

YANLIŞ: C tarzı dönüşümler kullanmak, örnek; (unsigned int) dam
DOĞRU: C++ bunun için static_cast, dynamic_cast, const_cast gibi çözümler sunuyor, bunları tercih edin.

(Aşağıdaki benim de çok sık yaptığım bir yanlış, daha doğrusu yılların alışkanlığı ama aslında değiştirmek lazım)

YANLIŞ: Gereksiz yerlerde #define ile makro tanımlamaları, mesela #define MAX_LEVEL 99
DOĞRU: Aslında bu durumlarda C++'da doğru olan const veya constexpr tercih edilmesi.

Az da olsa ucundan katkımız olsun konuyu okuyanlara, sevgiler.
 
Bende bir yorum ekleyeyim, C++ ile çalışırken C tarzı herhangi bir şey kullanmaktan kaçının. Dilin isminin C++ olmasının belirli bir sebebi var, daha çok fonksiyon ve geniş yelpaze. C tarzı string bunlardan sadece biri, eğer Metin2 kaynak kodlarına göz atarsanız neredeyse mümkün olan her yerde C tarzı kullanıma başvurulduğunu görebilirsiniz, konuya bir katkım olsun C tarzı kullanılmaması gerekenlerden aklıma gelenleri yazayım;

YANLIŞ: Bellek yönetimi için C tarzı malloc() ve free() kullanmak.
DOĞRU: Bellek yönetimi için new ve delete kullanmak veya daha iyisi akıllı işaretçiler kullanarak (std::unique_ptr, std::shared_ptr vs.) olası sızıntıların önüne geçmek.

YANLIŞ: short arg[19]; gibi dizi tanımlayıp bunu işaretçilerle kullanmak.
DOĞRU: std::array veya kullanım alanına göre std::vector tarzı konteynerler kullanmak.

YANLIŞ: C tarzı dönüşümler kullanmak, örnek; (unsigned int) dam
DOĞRU: C++ bunun için static_cast, dynamic_cast, const_cast gibi çözümler sunuyor, bunları tercih edin.

(Aşağıdaki benim de çok sık yaptığım bir yanlış, daha doğrusu yılların alışkanlığı ama aslında değiştirmek lazım)

YANLIŞ: Gereksiz yerlerde #define ile makro tanımlamaları, mesela #define MAX_LEVEL 99
DOĞRU: Aslında bu durumlarda C++'da doğru olan const veya constexpr tercih edilmesi.

Az da olsa ucundan katkımız olsun konuyu okuyanlara, sevgiler.
Katkın için çok teşekkür ederim. Çok mutlu oldum açıkcası yorumunuza, özellikle sizden bunları duymak beni bu seride daha çok motive etti doğrusu. Zaten konularımda bariz belli etmesemde bunları göstermeye çalışıyorum. İlerleyen süreçlerde akıllı işaretcilerden vs bahsedicem hatta burda bahsetmeyi düşünüyodum ancak biraz erken diye kısa kestim.
Kolay yazma, birleştirme, kesme ve arama işlemleri
Mesela şurda belirtmiştim ama sanırım düşündüğüm örnekleri versem iyi olurmuş ki zaten siz vermişsiniz. Tekrardan konuya katkınız için çok teşekkür ederim. Muhteşemsiniz. 😇
 
Geri
Üst