PDA

Tam Sürümünü Görmek İçin : Göstericilerle ilgili


LEthaL
14/05/2003, 23:03
Sorun şöyle while döngülerinin içinde ayrı ayrı karakterleri yazdırınca sorun yok döngülerin bitiminde "%s" diyip yazdırınca sorun var. ve fonksiyon boş değer döndürüyor.


#include <stdio.h>
#include <conio.h>
char *strcat(char *s1, char *s2)
{
char *str;
int i;
/* bu kitaptaki ornek; derlendigi zaman calismayan ise benimkisi.
char *str=s1;
while(*s1 != '\0')
{
++s1;
}
printf("%c",*s1);
while( (*s1++ = *s2++) != '\0')
; */
while(*s1 != '\0')
{
*str = *s1;
printf("%c",*str);
++str;
++s1;
}
// while dongusunde tek tek yazdirmasina ragmen
// alttaki satir neden calismiyor bir turlu cozemedim.
printf("%s",str);
while (*s2 != '\0')
{
*str = *s2;
printf("%c",*str);
++str;
++s2;
}
*str = '\0';
// for dongusude ekrana sadece " " bosluk karakteri yazdiriyor.
for(i=0;i<=12;++i)
printf("%s",str);

return str;
}
int main()
{
clrscr();
char *s;
s = strcat("LEt","haL");
printf("%s",s);
getch();
return 0;
}


Bir de şu katarı ters çevirme yapan fonksiyon çalışmıyor ama neden anlayamadım. Mantığıma göre çalışması lazım ama yok. İnat ediyor çalışmamakta.

#include <stdio.h>
#include <conio.h>
char *terscevir(char *katar)
{
char *yeniKatar;
int i=0,j;
while(*katar != '\0')
{
++i;
++katar;
}
printf("%d",i);
for(j=0;i>0;--i,++j)
yeniKatar[j]=katar[i-1];
yeniKatar[j] = '\0';
printf("%d",j);
return yeniKatar;
}
int main()
{
clrscr();
printf("%s",terscevir("LEthaL"));
getch();
return 0;
}



Sanırım hep aynı yerde yanlış yapıyorum ama bir türlü bulamadım.


LEthaL
14/05/2003, 23:05
'\0' diye çıkması gereken yerler ' ' diye çıkmış. '\0' ı düzelttim yukarki mesajda.

fatalnmake
14/05/2003, 23:49
usttekine bakmadim da alttakinde katar pointerini geri alman lazim while icinde ilerletmissin oole kalmis tekrar ilk karaktere point ettirirsen duzelir

ee++
14/05/2003, 23:50
İlk kodda str, yerine s2'yi yazdırmayı denesen? (Kodu pek incelemedim, kod pek hoş görünmüyor.. Sadece hemen gözüme çarpan şeyi söylüyorum..)

İkinci kodda ise büyük bir katliam var. yeniKatar icin malloc nerede!?...

Volkan Uzun
15/05/2003, 07:09
birinci kodda da yer ayirma problemi var.
ama once printf neden calismiyor onu soyleyim.
sen while ile yazdırırken surekli, str'nin gosterdiği yeri ++ yaparak değiştiriyorsun.
sonra da printf yaparken aslında str stringinin en basini değil en sonunu gösteriyor. yani while dongulerinde gostericinin ilk gosterdigi alan manipule oluyor. bunun disinda kodu senin gonderdiğin halde derlemek bile mumkin değil.

---------
char *str=s1; ok bunu yapmissin.
while(*s1 != '\0')
{
*str = *s1;
printf("%c",*str);
++str; // peki bu ++ yapiyor artık en bastaki yeri gostermicek
++s1;
}

sonrada gidip s2 null olmadigi surece strnin arkasina karakterleri yapıştırmışsın ana strnereyi gosteriyor hafızada ? bilinmeyen bir yeri.

Volkan Uzun
15/05/2003, 07:18
2. sorudada aynı problem var, pointerin degerini manipule ediyorsun.
------------------
dogrusu :
#include <stdio.h>
#include<stdlib.h>
#include <conio.h>
char *terscevir(char *katar)
{

int i=0,j;
while(*(katar+i) != '\0')
{//sen burada katar i surekli artirip gosterdiği alanı manipule ediyordun
++i;
}
printf("%d\n",i);
şimdi hafıazada düzgün bir yer göstersin
char *yeniKatar = (char *)malloc(sizeof(char)*(i+1));
//artık katar gene stringiin en basini gosteriyor
for(j=0;i>0;--i,++j)
yeniKatar[j]=katar[i-1];
yeniKatar[j] = '\0';
printf("%d",j);
return yeniKatar;// biz treturn ettik kim delete edecek malloc lu alanı ?!?
}
int main()
{

printf("%s",terscevir("LEthaL")); // bu arada burada memory leakege yaptık haberin ola, direk yazdirdiğin için malloc u delete edemedik
return 0;
}

Volkan Uzun
15/05/2003, 07:29
bu arada bu tip hataları engellemek için c nin verdiği harika bir keyword vardır : "const", degeri degismeyek değişkenleri const yap.
orneğin terscevir fonksiyonunu su skeilde tanımlasaydın (ilk ornek içinde olur ) hatayı hemen görürdün:
char *terscevir(const char * const katar)

ee++
15/05/2003, 09:05
strcat islevi su sekilde olmali:

char * strcat(char *dst, const char *src)
{
char *ret = dst;

while(*++dst != '\0');
while((*dst++ = *src++) != '\0');

return ret;
}

(glibc'den alip biraz igrencligini giderdim..)

ee++
15/05/2003, 09:39
strrev icin de soyle bir sey yazdim:

char *strrev(char *str)
{
char *p1, *p2, tmp;

p1 = p2 = str;
while (*++p2 != '\0');
--p2;

while(p2 > p1)
{
tmp = *p1;
*p1++ = *p2;
*p2-- = tmp;
}

return str;
}