C´de scanf() ile değer alma önceliği
C´de scanf() ile değer alma önceliği
Basit bir örnek üzerinden sorumu sorayım :)
Scanf() ile 2 sayı ve bir operatör (+,-,*,/,%) alıp işlem yapıyoruz.
[hr]
int main(void){
int bir,iki;
char operator;
printf("Operatör gir: "); scanf("%c",&operator);
printf("İşlem için ilk sayıyı gir > "); scanf("%d",&bir);
printf("İşlem için ikinci sayıyı gir > "); scanf("%d",&iki);
switch(operator){
//girilen sayılar ve operatöre göre işlem burda yapılıyor.
default:
printf("Yanlış Operatör Girdiniz.");
}
return 0;
}
[hr]
Üstteki kodda sorun yok. Şimdi Girdi sırasında bir değişiklik yapalım ve Operatörü 2 sayıyı aldıktan sonra girilmesini isteyelim.
int main(void){
int bir,iki;
char operator;
printf("İşlem için ilk sayıyı gir > "); scanf("%d",&bir);
printf("İşlem için ikinci sayıyı gir > "); scanf("%d",&iki);
printf("Operatör gir: "); scanf("%c",&operator);
switch(operator){
//girilen sayılar ve operatöre göre işlem burda yapılıyor.
default:
printf("Yanlış Operatör Girdiniz.");
}
return 0;
}
[hr]
Evet işte sorun burda çıkıyor. 2 sayıyı alıyoruz sıra operatöre gelince "Yanlış Operatör Girdiniz." mesajı ile program sonlanıyor.
Merak ettiğim Girdi önceliğinin neye göre olduğu:)
Cvp
Buffer ile alakalı bir durum sanırım.
Yazılım konusunda uzman olan insanlarda gördüğüm ortak bir nokta vardı. Uzamış ve dağınık saç, sakal. Temiz ama uyumsuz kıyafetler..[G1]
Şimdi daha iyi anlıyorum[G3]
C´yi araştırdıkça derinlere gidiyor[G1].
Cvp
Sorunu getchar() kullanarak hallettim. Buffer ile ilgiliymiş. Bu durum bana biraz garip geldi:)
[hr]
#include <stdio.h>
int main(void){
int bir,iki;
char operator;
printf("İşlem için ilk sayıyı gir > "); scanf("%d",&bir);
printf("İşlem için ikinci sayıyı gir > "); scanf("%d",&iki);
getchar();
printf("Operatör gir: "); scanf("%c",&operator);
switch(operator){
case ´+´: printf("%d %c %d = %d
",bir,operator, iki, bir + iki); break;
case ´-´: printf("%d %c %d = %d
",bir,operator, iki, bir - iki); break;
case ´%´: printf("%d %c %d = %d
",bir,operator, iki, bir % iki); break;
case ´*´: printf("%d %c %d = %d
",bir,operator, iki, bir * iki); break;
default:
printf("HATA: Tanımsız bir operatör girdiniz!
");
}
return 0;
}
Cvp
Buffer ile ilgili kafama takılan şu.
Programın başında değişkenlerin türünü belirleyip hafızada ona göre yer ayırıyoruz. Peki hepsinin yeri yurdu belliyken neden böyle bir sorun çıkıyor anlayamadım.
Cvp
fflush yapıp tekrar denedinmi? Çünkü eğer buffer ile alakalı ise ozaman bufferi temizlemen gerek. Dolayısı ile fflush yada bununla alakalı fonksiyonlar bufferi temizler.
Cvp
okunan operator´ü ekrana yazdırmayı denediğinde ne oluyor peki?
Cvp
Kusura bakmayın sorunu altta ki adreste tartışıp çözüme kavuşturduktan sonra buraya yazmayı unuttum.
[url]http://www.cagataycebi.com/forum/index.php?topic=313.0[/url]
Şimdi adreste açtığım başlığı tekrar okudumda çok garip yorumlar yapmışım :))
İlhan, fflush fonksiyonunu denemedim açıkcası. Ancak diğer çözüm yolları arasında en temizi bu olur sanırım. Sizler ne dersiniz.?
[url]http://www.sorucevap.com/bilisimteknolojisi/programcilik/c/ders.asp?206634[/url]
Kadir, iki sayıyı alıp operator´e sıra gelince program "Yanlış Operatör Girdiniz." mesajıyla sonlanıyordu.
Derleme için gcc kullanıyorum.