C de string birleştirme.(Strcat kullanmadan)

Başlatan baran123, 25 Haziran 2015, 20:58:58

mir_as82

#15
Alıntı yapılan: mufitsozen - 26 Haziran 2015, 08:15:55
hedef yada sonuc(destination) dizin'in (string) boyunun yeterli olmadigi durumlarda cikabilecek kotu hatalari onlemek icin ben strncat kullanmanizi tavsiye edecegim.

bunun standard kaynak kodu:
#include <stddef.h> /* size_t */
char *strncat(char *dest, const char *src, size_t n)
{
    char *ret = dest;
    while (*dest)
        dest++;
    while (n--)
        if (!(*dest++ = *src++))
            return ret;
    *dest = 0;
    return ret;
}

yada daha sikistirilmis hali ile:

#include <stddef.h> /* size_t */
char *strncat(char *dest, const char *src, size_t n)
{
    char *ret = dest;
    while (*dest) dest++;
    while (n--)  if (!(*dest++ = *src++)) return ret;
    *dest = 0;
    return ret;
}

Hocam senin verdiğin kodu anlamaya çalıştım acaba yanlış mı anladım sorayım dedim. Bu kodda hedef stringin(dest) içinde birde fazla Null karakter olabilir mi?
Az önce tekrar baktım son While ın döngüsünün kapsamını yanlış anlamışım. : ).  n değeri iki stringin toplamından küçükse birleştirme tamamlanmıyor ve sonuna Null karakter koyup çıkılıyor
Veya n in tamamlanmasını beklemeden source stringin sonunda null görünce çıkıyor

mufitsozen

Alıntı yapılan: mir_as82 - 26 Haziran 2015, 12:42:09
Hocam senin verdiğin kodu anlamaya çalıştım acaba yanlış mı anladım sorayım dedim. Bu kodda hedef stringin(dest) içinde birde fazla Null karakter olabilir mi?

null derken \0 (0x00) kastediliyorsa hayir. cunku 0x00 dizin sonunu gosterir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Ama klas bir kodlama. İnşallah ileride bende bunun gibi kodlama yapabilirim. Hala süslü parantez aç-kapat yapmaktan vazgeçemiyorum.

mufitsozen

#18
Alıntı yapılan: mir_as82 - 26 Haziran 2015, 12:52:59
Ama klas bir kodlama. İnşallah ileride bende bunun gibi kodlama yapabilirim. Hala süslü parantez aç-kapat yapmaktan vazgeçemiyorum.

her turlu tasarimda zerafet(elegance) sadelikten gecer diye bir dusunce var.

Bauhaus design school diye bakarsan mimari vs ornekleri gorursun https://www.google.com.tr/search?q=minimalism&newwindow=1&biw=1257&bih=612&source=lnms&tbm=isch&sa=X&ei=f36NVaW_G8a6sQHS96DYDQ&ved=0CAYQ_AUoAQ#newwindow=1&tbm=isch&q=bauhaus+design.

(yada minimalism https://www.google.com.tr/search?q=minimalism&newwindow=1&biw=1257&bih=612&source=lnms&tbm=isch&sa=X&ei=f36NVaW_G8a6sQHS96DYDQ&ved=0CAYQ_AUoAQ

Bu akim 1960lar ve 70lerde Amerikada cok yogundu, hala da yogun. C, ve Unix yaraticilari bu akimlardan cok etkilendiler. Bu yuzden Unix ve C'nin yaraticilari bu ortamlari bir takim kurallar uzerine kurdular. Ornegin KISS prensibi bunlardan bir tanesidir (KISS= Keep It Simple, Stupid) Bununla ilgili bir aciklama apache web sitesinde var https://people.apache.org/~fhanik/kiss.html

Ayrica C ve Unix'i tasarlayanlar bu ortami kullananlarin muhakkak bilgisayardan anlayan kimseler oldugunu dusunerek, az mesaj veren, sadece bir isi iyi yapan kucuk program parcalarinin birinden oburune bilginin akisini saglayan bir yapi gibi yapisal tasarimlar yaptilar. Cok verilen bir ornek

Bu konuda yazilmis kitaplar vb bile vardir. Kisa bir ozet yaparsak bu prensiplerden bazisi:

    Small is beautiful.

    Make each program do one thing well.

    Build a prototype as soon as possible.

    Choose portability over efficiency.

    Store numerical data in flat ASCII files.

    Use software leverage to your advantage.

    Use shell scripts to increase leverage and portability.

    Avoid captive user interfaces.

    Make every program a filter.

C Standard library'deki fonksiyonlarin buyuk bir bolumu bu prensipler uzerine kuruludur. (ornegin o yuzden strcat return degeri olarak dest string ptr kullanir, bu sekilde ayni satirda ic ice strcat kullanarak bir suru dizini birbirine ekleyebilirsiniz). yada strncat eger ekleme isleminde alan dizinin boyu yetmezse hicbir hata kodu vermez, cunku programci bunun olmayacagini zaten baska bir sekilde garanti etmistir diye dusunur, vs vs

Iste buda 1970lerden onemsiz bir kac ani. Unutulmus tarih gibi :-)
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

baran123

Tamamdır teşekkürler herkese :)
Şu bayağı şaşırttı :D
Alıntı yapılan: CLR - 26 Haziran 2015, 03:56:11
Aşağıdaki gibi dene çalışacaktır

typedef unsigned char	 u8;
typedef const unsigned char  uc8;

u8 * MyStrCat(u8 *s, uc8 *Add)
{
    u8 *Ret=s;
    while(*s)  s++; // string sonuna git
    while(*s++ = *Add++); // ekle
    return Ret;
} 

örnek:
u8 Ms[20]="Merhaba";

puts(MyStrCat(Ms," Kardes"));

// ekrana "merhaba kardes" basacaktır


CLR

Knowledge and Experience are Power

baran123


mufitsozen

Alıntı yapılan: Baran Ekrem - 27 Haziran 2015, 01:55:43
Bu kadar kısa beklemiyordum. :)

minimalizm felsefesi :-)

Aslinda C Standard library Wikisinden buradaki baska fonksiyonlara da bakip nasil calistiklarina bakarsan C'yi amaclandigi gibi kullanan bir stilde ogrenirsin.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

sovalye

#23
#include <stdio.h>
#include <stdlib.h>

char* birleştir(char *s1, char* s2){
    int i1 = 0, i2 = 0, j;
    while (s1[i1] != '\0') i1++;
    while (s2[i2] != '\0') i2++;
    char *toplam = (char*)malloc(sizeof(char)*(i1+i2+1));
    for (j = 0; j < i1; j++)
        *(toplam + j) = s1[j];
    for (; j < i1+i2; j++)
        *(toplam + j) = s2[j - i1];
    toplam[j] = '\0';
    return toplam;

}

int main(void){
    int i = 0;
    char *yazi1 = "selam";
    char *yazi2 = "naber";
    yazi1 = birleştir(yazi1, yazi2);
    printf("%s", yazi1);
    free(yazi1);
    return 0;
}


İlk başta büyük boyutlu dizi tanımlamaktan kurtulmak için veya birleştirilecek dizilerin boyutu hakkında bir bilgin olmazsa işlemi bu şekilde de yapabilirsin.
Edit: hatirlatma üzerine free ekledim.

mir_as82

Hocam aldigin yeri free lemen gerekiyor muydu? Main fonksiyonu içinde ?

Gökhan BEKEN

Güzel mantık ama malloc komutu her platformda kullanılamıyor benim bildiğim.
Özel mesaj okumuyorum, lütfen göndermeyin.

sovalye

@mir_as82  doğru söylüyorsunuz hocam. Hızlı yazıyım dedim, belleği geri vermeyi unutmuşum.
@Gökhan BEKEN tüm platformlar destekliyor diye biliyorum. Ccs c bile destekliyor.