Tam Sürümünü Görmek İçin : Strcpy-Strcat
gokhanozbulak
25/04/2007, 23:37
Arkadaşlar
Mesela
char *name = "Gokhan";
char full[6];
char *surname = "Ozbulak";
...
strcpy(full,name);şeklinde bir kodlama yaptığım zaman,null-terminated karakterin kopyalanamaması gerekmez mi? Ancak full değişkenini ekrana bastığım zaman 'Gokhan' ifadesi çıkıyor, derleyici null terminated karakteri kendisi mi atıyor acaba?
Bir diğer sorumda strcat ile ilgili olacak.
char *name = "Gokhan";
char *surname = "Ozbulak";
char all[10];
...
strcpy(all,name);
strcat(all,surname);Burada all 10'luk bir array olmasına rağmen 6 karakterlik bir kopyalama yaptım, akabinde de surname i all a ekledim ancak gördüğüm kadarıyla bu ekleme all arrayının sonundan değil, all ın ilk boş indexinden başlıyor, normalde sonundan başlaması gerekmezmi?
myavuzselim
25/04/2007, 23:44
Arkadaşlar
Mesela
char *name = "Gokhan";
char full[6];
char *surname = "Ozbulak";
...
strcpy(full,name);şeklinde bir kodlama yaptığım zaman,null-terminated karakterin kopyalanamaması gerekmez mi? Ancak full değişkenini ekrana bastığım zaman 'Gokhan' ifadesi çıkıyor, derleyici null terminated karakteri kendisi mi atıyor acaba?
strcpy sonuna '\0' karakterini ekliyor, ama bu durumda degistirmemesi gereken bir yeri degistiriyor. Ummadigin yerde hataya yol acabilir. Calisiyormus gibi gorunmesi hatasiz oldugu anlamina gelmez.
acehreli
25/04/2007, 23:49
Burada tanimsiz davranis var. strcpy ve strcat'in belgeleri, hedefte yeterince yer olmasini sart kosar. Yer olmadan kullanirsak her sey olabilir... :)
Ali
gokhanozbulak
26/04/2007, 00:02
Fakat kopyalama yaptığım full arrayi 6'lık bir kapasiteye sahip,o durumda Gokha yı alıp son index e de '\0' - null ter. karakteri koyması gerekiyo, fakat hepsini alıyor gibi görünüyor. Hatta ben assembly'deki gibi düşünüp '\0' ı görene kadar devam eder diye düşünmüştüm yani GokhanOzbulak basar diye düşünmüştüm tip tanımlamalarının memoryde alt alta geldiğini varsayarak.Ancak tabi böyle bir tabloda bu durum söz konusu değil.
quasimodo
26/04/2007, 00:30
C dili , bilgisayarin var olmayan bir elemani kullanmasini
engelleyecek herhangi bir dizi siniri kontrolune sahip
degildir. Bu sebepten, calismakta olan bir program
uyari vermeden dizinin disina cikabilir. Senin yapman
gereken butun dizi kullanimlarinin dizi siniri icinde
kalacagindan emin olmaktir.
acehreli
26/04/2007, 01:02
Diziler islevlere dizi olarak gonderilemezler. O yuzden strcpy'nin veya strcat'in bir dizinin buyuklugunden haberleri olamaz. Zaten o yuzden belgeleri "hedefte yeterince yer olmalidir" der.
Senin "Gokha'nin sonuna '\0' koymasinin" *gerektigini* soylemen tamamen senin dusundugun bir sey degil mi? Cunku o islevlerin nasil davrandiklarini yalnizca o islevlerin belgelerini (documentation, manual page, vs.) okuyarak bilebiliriz.
Ali
gokhanozbulak
26/04/2007, 02:48
Yalnız benim kafama takılan şey: char full[6] deklarasyonunu yaptığımda git mem.den 6 tane arka arkaya 1 byte'lık yer al demiş oluyorsam, ve bu alanı ilklediğimde 6'nın üstünde bir karakter katarı kullanıyorsam, c derleyicisi mem.deki alanın 6 byte ını doldurduktan sonra geriye kalan karakterleri nasıl saklıyor?
acehreli
26/04/2007, 03:21
Bellekte o dizinin yakininda baska ne nesneler varsa, onlarin ustune yaziyor. :)
Ali
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.