C kodunda scanf veri alma sorunu

Arkadaşlar merhaba şöyle bir kod yazdım ancak sayıları girince işlem yapılması gerekirken sonuç olarak hep ilk girdiğim sayı çıkıyor. Nerde hata yaptığım konusunda yardımcı olur musunuz ?

#include <stdio.h>

int main(){
	int a,b,c;
	char isaret;
	printf("2 adet sayi giriniz:");
	scanf("%d %d", &a, &b);
	printf("sembol giriniz :");
	scanf("%s",&isaret);
	
	switch(isaret){
		case '+':
			c=a+b;
			printf("%d",c);
			break;
		case '-':
			c=a-b;
			printf("%d",c);
			break;
		case '/':
			c=a/b;
			printf("%d",c);
			break;
		case '*':
			c=a*b;
			printf("%d",c);
			break;
			default: 
			printf("gecerli isaret girin");
		
	}
	
	
	return 0;
}

%s herhangi bir uzunlukta string bekleyip, \0 sonlandiricisi ile beraber &isaret'e yaziyor. Tek karakterlik yer oldugu icin buffer overflow oluyor.

Girdiyi sinirlayip kopyalanacagi kadar yer vermeniz lazim:

	char isaret[2];
	scanf("%1s", isaret);

%c okumak da bir opsiyon, fakat ust satirin satir sonlandiricisini okuyabilir. (Bu nasil cozuluyor hatirlamiyorum—“flush stdin” aratilabilir.)

1 Beğeni

Kodun düzeltilmiş hali:

#include <stdio.h>

int main(){
	int a,b,c;
	char isaret;
	printf("2 adet sayi giriniz:");
	scanf("%d %d", &a, &b);
	
	
	printf("sembol giriniz :");
	scanf(" %c",&isaret);
	

	
	switch(isaret){
		case '+':
			c=a+b;
			printf("%d",c);
			break;
		case '-':
			c=a-b;
			printf("%d",c);
			break;
		case '/':
			c=a/b;
			printf("%d",c);
			break;
		case '*':
			c=a*b;
			printf("%d",c);
			break;
			default: 
			printf("gecerli isaret girin");
		
	}
	

	return 0;
}

Bir sorunun birden çok çözümü vardır.

char isaret;

işareti char tanımlayıp, %s ile string olarak çekmek doğru bir yaklaşım gibi görünmedi bana.

scanf() sıkıntılı bir fonksiyondur. Tamponu boşaltmaz tampon dolu iken bir karakter daha almaya çalışmak almadan öncekini almasına neden olur.

Flush ile tampon temizlemek gerekir.

yada ufak bir kızılderili numarası;

scanf(" %c",&isaret)

%c den önce bir boşluk bırakırsanız o bu işi bir şekilde halleder.

1 Beğeni