{
int x,y;
char *secim;
float sonuc;
printf("iki Sayi Giriniz=");
scanf("%d %d",&x,&y);
printf("Seciminiz=");
scanf("%s",&secim);
switch (secim)
{
case '+':sonuc=x+y;break;
case '-':sonuc=x-y;break;
case '/':sonuc=x/y;break;
case '*':sonuc=x*y;break;
default :
printf("Yanlis islem");break;
}
printf("Sonuc = %f\n",sonuc);
getch();
}
Resource/Kaynak: http://www.frmtr.com/c-ve-c-/6767426-c-ve-c-da-char-sorunu.html#post61080352
Question Owner/Soru Sahibi: hemdehtml
ENGLISH
When you try to create string of characters (like char *secim), this string -if you don't initialize with values- it's last element
-which is our only element- will be null.
"char *secim;" actually means "char *secim = {'\0'}". When you try to assign new value in this pointer, you are trying to resize it which can not be possiblw. Because we should always have null value at the end of string.
You can improve your code by initializing x and y as floats. Because if our result is float, then we lost data because of int initialization. Because at the end if our result is 10/7 = 1,..., the result will be 1 because inputs are integer.
The full code is below.
TÜRKÇE
Bir karakter dizisi yaratmaya çalıştığınızda (char *secim gibi), bu dizi -initialize durumunda bir değer atamazsanız şayet- son elemanını (yani bizim var olan tek yerimizi) "null" karakteriyle dolduruyor. Somutlaştırırsak:
"char *secim;" demek aslında "char *secim = {'\0'};" demekle aynı şeydir. Ve siz yaptığınız işlemde bu "null" karakterinin yerine başka bir karakter atamaya çalışıyorsunuz. Yani "secim[1]" i "secim[2]" yapmaya çalışıyorsunuz. Çünkü bildiğimiz üzere her dizinin son elemanı "null" yani '\0' olmak zorundadır.
Sorununuzu "char secim[2];" yazarak basitçe çözebilirsiniz.
siz bir pointer tanımladınız. pointerlar yanına yıldız koymazsanız adresi tanımlarlar. O yüzden switch içerisindeki "secim" in solunda yıldız olmalı. ve sadece "secim" yazarsak bir adresi belirteceği için, scanf fonksiyonunun içinde "secim" in yanına "address-of" operatörünü koymamalıyız.
kodunuzu iyileştirmek için integer olarak tanımladığınız x ve y 'yi float olarak tanımlayabilirsiniz. Çünkü int karakterlerle işlem yaparken küsürlü bir sonuç elde ederseniz, bu sonucun sadece tam kısmı tutulur. Dolayısıyla bu kısmı float'a aktarırken veri kaybı yaşarsınız. Örnek olarak 10/7=1,... olması gerekirken, int olarak tanımlamanızdan dolayı sonucu 1 olarak çıktıda görürsünüz.
Kodun tamamını aşağıda bulabilirsiniz.
CODE/KOD
void main()
{
float x, y;
char secim[2];
float sonuc;
printf("iki Sayi Giriniz=");
scanf("%d %d", &x, &y);
printf("Seciminiz=");
scanf("%s", secim);
switch (*secim)
{
case '+':sonuc = x + y; break;
case '-':sonuc = x - y; break;
case '/':sonuc = x / y; break;
case '*':sonuc = x*y; break;
default:
printf("Yanlis islem"); break;
}
printf("Sonuc = %f\n", sonuc);
getchar();
}
No comments:
Post a Comment