PDA

Tam Sürümünü Görmek İçin : Karakter pointer problemi


sadist_sniper
07/11/2004, 14:13
#include <stdio.h>
extern char **environ;
main(int argc,char *argv[])
{
int i,namelen=0;
char esit='=';
char *sonuc;
if(argc==1)
for (i=0;environ[i]!=NULL; i++)
printf("%s\n", environ[i]);

else if(strcmp(argv[1],"-i")!=0)
{
namelen=strcspn(argv[1],"=");
strncpy(sonuc, argv1], namelen);
printf("%s\n",sonuc);
printf("%s\n",&argv[1][namelen+1]);
}
exit(0);
}

Bu kod üzerinde çalışıyodum. Yapmak istediğim şey, mesela programı "doenv path=onur" şeklinde çalıştırdığım zaman, ekrana "=" işaretinin öncesini ve sonrasını alt alta yazmasını istiyorum. Bunu becerdim de. Ama şöyle bir sorun var. diyelim ki programı "doenv path=onur" şeklinde çalıştırdım, alet "path" yazması gerekirken "pat`" yazıyor. diğer kısmı normal...

her ne kadar değişkeni "*sonuc" olarak tanımlamak istemesem de, öyle tanımlamak zorundayım çünkü "=" işaretinden önce gelecek karakter dizisinin boyutunu önceden bilmek zor.

Sizce problem nedir?


Volkan Uzun
08/11/2004, 09:27
sonuc icin hafizada yer ayirmadan icine bisiler kopyalamissin
ilk ciddi hata bu sanirim

acehreli
08/11/2004, 09:30
Bir kac not...

1) main'in donus turu int'tir ve bildirilmesi gerekir:

int main(int argc,char *argv[])


2) Bu koda <string.h> ve <stdlib.h> basliklarinin da eklenmeleri gerekiyor...

3) strcpy ailesinden olan islevler, hedefte kopyalanacak karakterler icin yer oldugunu varsayarlar. Senin kodunda ise 'sonuc' hicbir hedefi gostermiyor; ona ilk degerini vermiyorsun.

Ya diziden tasma gibi sorunlarla ugrasmayi goze alarak :) dizi kullanmalisin:

char sonuc[BUYUK_BIR_SAYI];

ya da bellek kaybi gibi sorunlarla ugrasmayi goze alarak :) dinamik bellek kullanmalisin:

char * sonuc = malloc(/* ... */);

4) strncpy; hedefin sInIrIna geldigi icin kopyalamayi durdurdugu zaman, hedefe sonlandirma karakteri eklemez. Her strncpy kullandiktan sonra bunun elle yapilmasi gerekir. (Zaten bu yuzden strncpy son derece kotu tasarlanmis bir islevdir):

char sonuc[BUYUK_BIR_SAYI];
strncpy(sonuc, kaynak, BUYUK_BIR_SAYI - 1);
sonuc[BUYUK_BIR_SAYI - 1] = '\0'; // <--- Unutulmamalidir

Yoksa, dizinin disina tasma tehlikesine acik kaliriz.

Ali