Arkadaşlar C de bir program yapmaya çalışıyorum.Kullanıcıdan 10 tane şehir ismi alacak.derleyici hata vermemesine rağmen çalıştırdığımda 4.şehre kadar alıyor.sonra hata verip kapanıyor.
işte kod :
#include <stdio.h>
main()
{
char *city[10];
int i;
/*Accept the city names*/
for(i=0;i<10;i++)
{
printf("Please enter %d.city: ",i+1);
scanf("%s",city[i]);
}
getchar();
}
Nerede hata yapıyor olabilirim ? Yardımlarınız için şimdiden teşekkürler arkadaşlar.
Cevaplar
T
scanf("%s",&city);
şeklinde "&" operatörü kullanırsan sorun düzelecektir.
düzeldi teşekkür ederim.ama bir sorum olacak .city bir adres ismi değil mi zaten.ben başta *city[10] yani 10 tane pointer dizisi tanımlamıştım.bu durumda pointerlar zaten bir adres olduğundan adres operatörü neden gerekiyor ?
L
ben bişey sormak istiyorum, bu benim şahsi sorum, öğrenci misiniz ?
evet neden ?
L
neden böyle bi programa ihtiyaç duydunuz diye sorucaktım, burada soru soranlarla ilgili genel bi profil oluşturmaya çalışıyorum kafamda da...
kaçıncı sınıf peki ?
eSa üstadım bunu anket haline getirsek mi ?
1.sınıfım. aslında ihtiyaçtan değil bu sadece programın bir parçası, sadece aklıma takılan yeri burada gelip sordum.amaç öğrenmekti ama cevap alsam bile açıklama bulamadım bu yüzden anketten önce bunu düşünün derim.sormakla bir çözüm elde edemiyoruz çünkü burada.
L
ben c++ programcısıyım, c karakter katarını yanlızca optimizasyon ve bir işaretçi amacıyla kullanıyorum...
özür dilerim böyle bodozlama daldım.
Önemli değil ama sorumun cevabı bu değil...
L
sorunun cevabı c karakter katarları hayatımda gördüğüm optimizasyonda bu kadar emeği olupda en ufak çıkardığı sorunda üzerine geliştirilen sınıflar tercih edilip göz ardı edilen tek veri tipi... :D
sorunuzu google da bulabilirsiniz, inanın şu an uzun uzağa bu konuya dalamicam ama sorun şurdaki siz işaretçi dizisi oluşturuyorsunuz oluşturduğunuz işaretçiler karakter katarı işaretçileri ve bellekte onlar için yer ayırmıyorsunuz... :D
Yer ayırmayınca & kullanılır gibi bir genelleme olduğunu düşünmüyorum.ayrıca normal bir integer tanımladığımız zamanda malloc ya da calloc ile yer ayırmıyoruz.
sorumu baştan soruyorum.
mesela bir dizi tanımladığımız zaman dizi zaten bir adrestir diyerek scanf de & işaretini kullanmıyorduk.burda da aynı şey geçerli.çünkü ben 10 tane dizi tanımlıyorum.cevap vermemekte ısrar edişinizi de anlamıyorum.amacınız bilgilendirmekse bilgilendirin.zaten değilse de söyleyin ben de ona göre zamanımı harcamayayım bu sitede.googla da bulabilsem zaten gelip böyle bir forum sitesinde sormazdım.
E
Aynı şekilde bizde ödev aldık üniversite öğrencisimisin.
evet yardımcı olabilir misin acaba ?
scanf("%s",&city); bu şekilde yaptığında da bence hatalı bir kullanım olabilir. Bu access violation'a sebep olur. char city[10][100]; bu şekilde tanımlayıp, & kullanmamak daha doğru olabilir.
access violation ne demek bilmiyorum ama evet ben de iki boyutlu bir diziyle öyle yapılabileceğini biliyorum.ama pointerla aynı şeyi nasıl yaparız dediğimde hocamız bu şekilde göstermişti ama çalışmadı.pointerla yapma şansımız yok mu iki boyutlu diziyle yapabildiğimiz şeyi ?
Bu şekilde yaptığında program safe olmayacak, çalışıyor gibi görünse de aslında random olarak access violation verebilir. Burada pointer kullanmak çok mantıklı olmayacaktır. En hızlı yöntem dediğim gibi yapmak ama şöyle bir ipucu da verebilirim:
char *a = (char*) malloc(100); free( a ); ile char a[100]; aynı şeydir. Sadece free yaptığın satırı kendin belirlemen gerekiyor. Arrayda bu işlem otomatik yapılır.
Allocate edilmemiş bir belleğe erişmek istediğinde acces violation oluyor yani erişim ihlali :)
hmm anladım sanırım...çok teşekkür ederim aydınlattığınız için :)
Cevabını yaz
Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.