C de string birleştirme.(Strcat kullanmadan)

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

baran123

Strcat iş görüyor ama dipten nasıl yapılır onu öğrenmek istiyorum.

static char MyText[32];

// daha float değerleri string yapıyorum
static void FloatToString(float f)
{
    sprintf(MyText, "%4.3f", f);
}

//sonra şöyle kullanıyorum
USART_SendString(USART2, strcat(MyText, "\r\n"));

//usart string de bu şekilde 
static void USART_SendString(USART_TypeDef* USARTx, char* s)
{
    while(*s)
    {
        while(!(USARTx ->SR & 0x00000040));
        USART_SendData(USARTx, *s);
        s++;
    }
}

Bu string in sonuna ""\r\n" ekleme işlemini nasıl yapabiliriz ?
Aslında string yanlış oldu char dizisinin sonuna nasıl eklerim :)

Klein

#1
sprintf ile çevirirken yapabilirdiniz

sprintf(MyText, "%4.3f\r\n", f);


illa bu şekilde yapmayacağım kendim yapacağım derseniz
karakter dizisinde  0 görene kadar ilerleyin. 0 gördüğünüz adrese "\r"  bir sonra kine "\n" bir sonrakinde de "\0" koyun.

Ek:
Könderme rutininde zaten dizinin sonuna kadar ilerliyorsunuz. Dizinin sonu geldikten sonra da koyabilirsiniz.

Gökhan BEKEN

#2
Ön bilgi:
Bir dizinin içinde kaç eleman var bunu öğrenmek:
bir while döngüsü içinde, array'in bütün elemanlarına sırayla bakılır ve bu sırada bir sayaç mütemadiyen artırılır. Ta ki eleman 0(yazıyla: sıfır) olana kadar.

fonksiyon prototipimiz böyle olacak:
void KatarBirlestir(char *katar, char *eklenecekKatar2);
ilk katarın adresini ve eklenecek olan katar'ın adresini veriyoruz.
Sonra ilk katarın kaç karakter barındırdığını, yukarda anlattığım yöntemle buluyoruz.
Aynı işlemi ikinci katar için de yapıyoruz.
Sonra ikinci elemanın karakter sayısı kadar bir for döngüsü kuruyoruz.
For'un her adımında, ilk katarın adresini bir artırarak, ikinci katardaki elemanları birer birer ekliyoruz.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

@Klein hocam evet öylede oldu.
static void USART_SendString(USART_TypeDef* USARTx, char* s)
{
    while(*s)
    {
        while(!(USARTx ->SR & 0x00000040));
        USART_SendData(USARTx, *s);
        s++;
    }
    USART_SendData(USARTx, '\r');
    USART_SendData(USARTx, '\n');
}


@Gökhan hocam bir de dediğiniz gibi yapmaya çalışayım bir de

Gökhan BEKEN

Benim dediğimi yaparsan arkaplanda ne yaptığını daha iyi anlarsın. İlerde karşılaşacağın sorunların sebebini anlarsın bir bakışta.
Ama program yazarken ben de sprint kullanıyorum pratik olduğu için.
Mottomuz: öğren ama kullanma...
Özel mesaj okumuyorum, lütfen göndermeyin.

muhittin_kaplan


baran123

Biraz daha çözeyim sprintfi de kendim yazacam.

Hocam uğraşıyorum da fonksiyon prototipinde hata var diyor ve işaretini gösteriyor ?

Gökhan BEKEN

#7
Onu demek istemedim hocam, "fonksiyonların nasıl çalıştığını öğrenmek için kendi fonksiyonlarını yaz ama, yine sprintf gibi hazır fonksiyonları kullan, pratik olsun" anlamında dedim.

mesaj birleştirme:: 26 Haziran 2015, 00:54:26

Baran & yerine * yaz düzelir. Yanlışlıkla öyle yazmışım şimdi düzelttim.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

Hocam şöyle bir şey denedim ama beceremedim sanırım

static char MyText[32];

static void KatarBirlestir(char* katar1, char* katar2)
{
    unsigned int sayac1 = 0;
    unsigned int sayac2 = 0;

    while(*katar1 != '\0')
    {
        katar1++;
        sayac1++;
    }

    while(*katar2 != '\0')
    {
        katar2++;
        sayac2++;
    }
    unsigned int i;

    for(i = 0;i < sayac2; i++)
    {
        katar1[sayac1 + i] = *katar2;
    }
}

KatarBirlestir(MyText, "\r\n");

Gökhan BEKEN

#9
Çalışmaması normal @Baran Ekrem 
while içinde artırdığın kısım varya kilit noktası orası.
katar1++; yaptığın zaman, o göstericinin gösterdiği yer de sürekli artıyor.
ve aşağıdaki for'a geldiğin zaman o son değerlere göre işlem yapıyor.

Şöyle bir düzenleme yaptım aklımca, ama denemedim, bir dene istersen:

char MyText[32]="ilk Katar , \0";
char MyText2[32]="ikinci Katar , \0";

static void KatarBirlestir(char* katar1, char* katar2)
{
    unsigned int sayac1 = 0;
    unsigned int sayac2 = 0;

    while(*(char *)(katar1+sayac1) != '\0')
    {
        sayac1++;
    }

    while(*(char *)(katar2+sayac2) != '\0')
    {
        sayac2++;
    }
    unsigned int i;

    for(i = 0;i < sayac2; i++)
    {
        katar1[sayac1 + i] = *katar2;
    }
}

KatarBirlestir(&MyText[0],&MyText2[0]);


mesaj birleştirme:: 26 Haziran 2015, 02:43:05

Bu arada belirtiyim, bu fonksiyonu uzun uzun yazdık ama normalde bunu çok daha kısa kodlarla da yapabilirsin. Normal çalışma mantığını anladıktan sonra optimize üzerine çalışır en kısa şekilde halletmeye odaklanırsın.

düzeltme: pointer'daki yazım hatası düzeltildi.
Özel mesaj okumuyorum, lütfen göndermeyin.

baran123

Hocam şu kısmı anlamadım
while(*(char)(katar1+sayac1) != '\0')
burada hata veriyor. sanırım sayac int olduğu için

Gökhan BEKEN

#11
Şu an deneyemiyorum char kısmını silip deneyebilirsin.
ya da şöyle dene:
while(*((char*) katar1+sayac1)!= '\0')

(şu an ne saçmaladığımı bilmiyorum, uykuluyum)
Ordaki amacımız, katar1 adresinin sayac1 kadar fazlası olan adresi okumak ve okuduğumuz değerin 0'a eşit olup olmadığı sürece döngüye sokmak.
Özel mesaj okumuyorum, lütfen göndermeyin.

CLR

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
Knowledge and Experience are Power

mufitsozen

#13
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;
}
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

Gökhan BEKEN

Programdaki hataları giderdim @Baran Ekrem
#include <stdio.h>

char MyText[32]="ilk Katar , \0";
char MyText2[32]="ikinci Katar\0";

void KatarBirlestir(char* katar1, char* katar2);

int main(void)
{
	KatarBirlestir(&MyText[0],&MyText2[0]);
	
	printf("sonuc: %s",&MyText[0]);
	        
        printf("\r\nislem tamam");
		char asdasda;
		scanf("%c",&asdasda); //getchar();   
    	return 0;
}


void KatarBirlestir(char* katar1, char* katar2)
{
    unsigned int sayac1 = 0;
    unsigned int sayac2 = 0;

    while(*(char *)(katar1+sayac1) != '\0')
    {
        sayac1++;
    }

    while(*(char *)(katar2+sayac2) != '\0')
    {
        sayac2++;
    }
    unsigned int i;

    for(i = 0;i < sayac2; i++)
    {
        katar1[sayac1 + i] = *(char *)(katar2+i);
    }
}
Özel mesaj okumuyorum, lütfen göndermeyin.