merhaba arkadaslar bir odevle ugrasıyorum kod asagıda; programı compile ettikten sonra baslıktaki gibi bir hata veriyor. amacım üzerine strcat ile ekleme yapılan char arrayini yeni eski haline döndürmek; fakat int main in altında tanımladıgım gibi tanımlamaya kalktıgımda olmuyor.
#include <string.h> #include <stdio.h> #include <conio.h> int main(void) { int i,x,y; char artist1[100]="Dropkick Murphys --"; char artist2[100]="Epica --"; char artist3[100]="Dream Theatre --"; char song11[50]="Boys On The Docks"; char song12[50]="Tessie"; char song21[50]="Dreamworld"; char song31[50]="Rush"; char song32[50]="Hollow Years"; char list[100]; char musiclist[5][100]; printf("Write the songs of the artist you want to listen which are listed below\n"); printf("Dropkick Murphys\nEpica\nDream Theatre\n"); printf("How many song :\n"); scanf("%d", x); while(x>5) { printf("Wrong value enter a number lower than 5 :\n"); scanf("%d", &x); } for(i=0; i<x; i++) { printf("Enter the %d. song you want to listen\n",i); gets(list); if(strcmp(list,song11)==0) { strcat(artist1,list); y=0; while(list[y]!='\0') { musiclist[y]=list[y]; y++; } artist1[100]="Dropkick Murphys --"; HATA BURDA } else if(strcmp(list, song12)==0) { strcat(artist1,list); y=0; while(list[y]!='\0') { musiclist[y]=list[y]; y++; } artist1[100]="Dropkick Murphys --"; HATA BURDA } else if(strcmp(list, song21)==0) { strcat(artist2,list); y=0; while(list[y]!='\0') { musiclist[y]=list[y]; y++; } artist2[100]="Epica --"; } else if (strcmp(list, song31)==0) { strcat(artist3,list); y=0; while(list[y]!='\0') { musiclist[y]=list[y]; y++; } artist3[100]="Dream Theatre --"; HATA BURDA } else if(strcmp(list, song32)==0) { strcat(artist3,list); y=0; while(list[y]!='\0') { musiclist[y]=list[y]; y++; } artist3[100]="Dream Theatre --"; HATA BURDA } } for(i=0; i<x; i++) { y=0; while(musiclist[y]!='\0') { printf("%c", musiclist[y]); y++; } printf("\n"); } getch(); return 0; }
Diziler string nesnesi değilki onları bu şekilde kullanamazsın.
char artist1[100]="Dropkick Murphys --"; ifadesinin ilk tanımlandığı yer uygun ama sonraki illegal bir davranış. Bu ifade ile dizinin 101. elemanına erişmeye çalışıyorsun yani alanın dışına. Fakat verdiği hata bundan değil, atama yaparken türlerin uyuşmamasından.
char = *const char; // hata
İstediğin işlemi yapmak için dizideki string ten sonraki ilk yere '\0' karakterini koyman yeterli. Mesela yukarıdaki string 19 karakter. 0 ile 18 arasındaki yer karakterlerin tutulduğu yer, yani bir sonrakini kullanacağız. Şöyle:
artist1[19] = '\0';
hoca bize character stringleri ni tanımlarken " " içinde tanımlanırsa '\0' ifadesi otomatik olarak sonuna ekleniyor demisti. ayrıca bir sorum daha olucak scanf("%s", list) yerine gets(list) yazınca for döngüsü direk olarak 2 kere dönüp dönme işlemi bittikten sonra benden gets fonksiyonunu devreye sokuyor neden_?. cunku bazı sarkılarda arası bosluk olanlar var ve scanf ile arası bosluk olanlar kullanılamaz denmisti. bu yuzden de gets kullanmaya calısıyorum ama beceremedim
yada şöyle birşey sorayım, alttaki kodu bir compile edip x=2 degerini girip ilk sarkı olarak Boys 2. olarak Tessie girdigimizde, en sonunda olusturulan ve print edilen musiclist arrayinin satır sonlarında anlamsız harfler cıkıyor. ama ben while a girerken while(musiclist[y]!='\0') kullandım ve '\0' gördügü anda alt satıra gecmesi lazım fakat birkac satır daha anlamsız harfler basıp öle geciyor alta. nedenini sorabilir miyim acaba _?
#include <string.h> #include <stdio.h> #include <conio.h> int main(void) { int i,x,y; char artist1[100]="Dropkick Murphys -- "; char artist2[100]="Epica -- "; char artist3[100]="Dream Theatre -- "; char song11[50]="Boys"; char song12[50]="Tessie"; char song21[50]="Dreamworld"; char song31[50]="Rush"; char song32[50]="Hollow Years"; char list[100]; char musiclist[5][100]; printf("Write the songs of the artist you want to listen which are listed below\n"); printf("Dropkick Murphys\nEpica\nDream Theatre\n"); printf("How many song :\n"); scanf("%d", &x); while(x>5) { printf("Wrong value enter a number lower than 5 :\n"); scanf("%d", &x); } for(i=0; i<x; i++) { printf("Enter the %d. song you want to listen\n",i); scanf("%s", list); if(strcmp(list,song11)==0) { strcat(artist1,list); y=0; while(artist1[y]!='\0') { musiclist[y]=artist1[y]; y++; } artist1[20]='\0'; } else if(strcmp(list, song12)==0) { strcat(artist1,list); y=0; while(artist1[y]!='\0') { musiclist[y]=artist1[y]; y++; } artist1[20]='\0'; } else if(strcmp(list, song21)==0) { strcat(artist2,list); y=0; while(artist2[y]!='\0') { musiclist[y]=artist2[y]; y++; } artist2[9]='\0'; } else if (strcmp(list, song31)==0) { strcat(artist3,list); y=0; while(artist3[y]!='\0') { musiclist[y]=artist3[y]; y++; } artist3[17]='\0'; } else if(strcmp(list, song32)==0) { strcat(artist3,list); y=0; while(artist3[y]!='\0') { musiclist[y]=artist3[y]; y++; } artist3[17]='\0'; } } for(i=0; i<x; i++) { y=0; while(musiclist[y]!='\0') { printf("%c", musiclist[y]); y++; } printf("\n"); } getch(); return 0; }
quote:
hoca bize character stringleri ni tanımlarken " " içinde tanımlanırsa '\0' ifadesi otomatik olarak sonuna ekleniyor demisti.
Evet ama strcat ile ekleme yapınca '\0' silinip üzerine diğer string in ilk harfi yerleşiyor. Sende silinen sonlandırma karakterini tekrar eski yerine koyuyorsun olay bu.
gets ile ilgili olarakta; string fonksiyonlarının çalışma şekilleri biraz karışık. Fonksiyon çalışıyor ama giriş tamponunda karakter varsa önce bunları okuyor. Yapman gereken gets kullanmadan hemen önce input buffer ı temizlemek. Şöyle ki;
fflush(stdin); gets(list);
quote:
Orijinalden alıntı: elektro_gadget
quote:
hoca bize character stringleri ni tanımlarken " " içinde tanımlanırsa '\0' ifadesi otomatik olarak sonuna ekleniyor demisti.
Evet ama strcat ile ekleme yapınca '\0' silinip üzerine diğer string in ilk harfi yerleşiyor. Sende silinen sonlandırma karakterini tekrar eski yerine koyuyorsun olay bu.
gets ile ilgili olarakta; string fonksiyonlarının çalışma şekilleri biraz karışık. Fonksiyon çalışıyor ama giriş tamponunda karakter varsa önce bunları okuyor. Yapman gereken gets kullanmadan hemen önce input buffer ı temizlemek. Şöyle ki;
fflush(stdin); gets(list);
evet gerckten işe yaradı bu fflush fonksiyonunu görmemistim şimdi ögrendim saolasın : )
int main(void) { int i,x,y; char artist1[100]="Dropkick Murphys -- "; char artist2[100]="Epica -- "; char artist3[100]="Dream Theatre -- "; char song11[50]="Boys"; char song12[50]="Tessie"; char song21[50]="Dreamworld"; char song31[50]="Rush"; char song32[50]="Hollow Years"; char list[100]; char musiclist[5][100]; printf("Write the songs of the artist you want to listen which are listed below\n"); printf("Dropkick Murphys\nEpica\nDream Theatre\n"); printf("How many song :\n"); scanf("%d", &x);
while(x>5) { printf("Wrong value enter a number lower than 5 :\n"); scanf("%d", &x); }