strcpy() Kullanımı
Coddy'nin C Journey'sinin Logic & Flow bölümünün bir parçası — ders 16 / 63.
Dizelerin uzunluğunu strlen() ile nasıl bulacağınızı öğrendiniz, ancak bir dizenin içeriğini diğerine kopyalamanız gerekirse ne olur? C'de, dizeleri normal değişkenlerde yaptığınız gibi kopyalamak için atama operatörünü (=) kullanamazsınız.
Bunun nedeni, string'lerin karakter dizileri olmasıdır ve dizilerle = kullandığınızda, gerçek içeriği değil, yalnızca bellek adresini kopyalıyor olmanızdır. İşte bu noktada <string.h> kütüphanesindeki strcpy() fonksiyonu vazgeçilmez hale gelir.
#include <stdio.h>
#include <string.h>
char source[] = "Hello";
char destination[20];
strcpy(destination, source); // "Hello" ifadesini destination içine kopyalarstrcpy() fonksiyonu iki argüman alır: hedef dizi (kopyalamak istediğiniz yer) ve kaynak dize (kopyalamak istediğiniz şey). Boş sonlandırıcı (null terminator) dahil olmak üzere her karakteri kaynaktan hedefe kopyalar.
Hedef dizinizin, kaynak dizginin tamamını ve boş sonlandırıcıyı (null terminator) tutacak kadar büyük olması çok önemlidir. Eğer hedef çok küçükse, strcpy() dizi sınırlarının ötesine yazacak ve belirsiz davranışa (undefined behavior) neden olacaktır.
Bu fonksiyon, C'de dize işleme için temeldir; dizeleri kopyalamanıza, dize değişkenlerini mevcut içerikle başlatmanıza ve dizeleri daha ileri işlemler için hazırlamanıza olanak tanır.
Görev
Kolaystrcpy() fonksiyonunu kullanarak dize kopyalamayı gösteren bir C programı yazın. Programınız şunları yapmalıdır:
- Gerçekleştirilecek dize işlemi sayısını temsil eden bir
ntam sayısı okuyun - Her işlem için:
- Girdiden bir kaynak dize (source string) okuyun
- 100 elemanlı
destinationadında bir karakter dizisi (array) tanımlayın - Kaynak dizeyi hedef diziye kopyalamak için
strcpy()kullanın - Hem orijinal kaynak dizeyi hem de kopyalanan hedef dizeyi yazdırın
- Tüm işlemlerden sonra, kopyalanan dizelerin bağımsız olduğunu şu şekilde gösterin:
- Son hedef dizisinin ilk karakterini 'X' olarak değiştirin
- Değiştiğini göstermek için değiştirilmiş hedef dizeyi yazdırın
strcpy() fonksiyonunu kullanmak için <string.h> başlık dosyasını eklemeyi unutmayın.
Çıktınız sonuçları aşağıdaki formatta görüntülemelidir:
Source: [source_string]
Destination: [copied_string]
Source: [source_string]
Destination: [copied_string]
...
Modified last destination: [modified_string]Örneğin, girdi şu şekildeyse:
3
hello
world
programmingÇıktınız şu şekilde olmalıdır:
Source: hello
Destination: hello
Source: world
Destination: world
Source: programming
Destination: programming
Modified last destination: XrogrammingBu görev, dize içeriklerini bir karakter dizisinden diğerine kopyalamak için strcpy() kullanımını, hedef diziler için uygun bellek ayırmayı ve kopyalanan dizelerin kaynaklarından bağımsız olduğunu anlama yeteneğinizi test eder.
Kopya kağıdı
C'de dizeleri kopyalamak için <string.h> kütüphanesinden strcpy() fonksiyonunu kullanın. Dizeleri kopyalamak için atama operatörünü (=) kullanamazsınız çünkü bu sadece bellek adreslerini kopyalar, gerçek içeriği değil.
#include <stdio.h>
#include <string.h>
char source[] = "Hello";
char destination[20];
strcpy(destination, source); // "Hello" içeriğini destination içine kopyalarstrcpy() fonksiyonu iki argüman alır: hedef dizi (kopyalamak istediğiniz yer) ve kaynak dize (kopyalamak istediğiniz şey). Kaynaktaki her karakteri, boş sonlandırıcı (null terminator) dahil olmak üzere hedefe kopyalar.
Tanımsız davranışlardan kaçınmak için hedef dizi, tüm kaynak dizeyi ve boş sonlandırıcıyı tutacak kadar büyük olmalıdır.
Kendin dene
#include <stdio.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char source[100];
char destination[100];
// YAPILACAK: Kodunuzu buraya yazın
// n adet dize işlemini işlemek için bir döngü kullanın
// Her işlem için:
// - Kaynak dizeyi okuyun
// - Kaynağı hedefe kopyalamak için strcpy() kullanın
// - Her iki dizeyi de istenen formatta yazdırın
// YAPILACAK: Döngüden sonra, son hedefin ilk karakterini değiştirin
// ve değiştirilmiş dizeyi yazdırın
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Logic & Flow bölümündeki tüm dersler
1Pointer Temelleri
Pointer Nedir?Pointer TanımlamaAdres Operatörü (&)Dereference Operatörü (*)NULL Pointer'larÖzet: Pointer Temelleri4Proje: Basit Metin Aracı
Projeye Genel BakışKarakter Sayma2İşaretçiler ve Diziler
İşaretçi Olarak Dizi İsimleriDizi Elemanları - İşaretçilerİşaretçi Aritmetiğiİşaretçilerin KarşılaştırılmasıÖzet: İşaretçi ile Dizi Gezinme5İşaretçiler ve Fonksiyonlar
Değer ile GeçmeFonksiyonlara İşaretçi Göndermeİşaretçiler ile Değişkenleri DeğiştirmeKlasik Bir Örnek: SwapFonksiyonlara Dizi GöndermeÖzet: Fonksiyon İşaretçi Argümanları8Yapılar ve İşaretçiler
Yapılara İşaretçilerOk Operatörü (->)Yapıları Değer ile AktarmaYapı İşaretçilerini AktarmaYapıların Dinamik TahsisiÖzet: Yapıyı Değiştirme - Ptr11Son Tekrar Görevleri
Tekrar: Dinamik String BirleştirmeTekrar: Struct DizisiTekrar: Kelime Frekans Sayacı3Karakter Dizileri ve Stringler
char Dizisi Olarak StringlerNull Sonlandırıcıscanf ile String Girişistrlen() Kullanımıstrcpy() Kullanımıstrcat() Kullanımıstrcmp() KullanımıÖzet: Temel String Fonksiyonları