C dilindeki kod neden çalışmıyor?

Unaxpre

Kilopat
Katılım
22 Ocak 2020
Mesajlar
2.632
Makaleler
14
Çözümler
25
Yer
İstanbul
İki sayı giriyorum örnek 1 ve 1 daha sonra + ya basıyorum toplasın diye sonucu yine 1 veriyor.

Kod:
#include <stdio.h>
#include <stdlib.h>

int main() {

 int s1,s2,sonuc;
 char islem;

 printf("1. Sayiyi Giriniz: ");
 scanf("%d",&s1);

 printf("2. Sayiyi Giriniz: ");
 scanf("%d",&s2);

 printf("Islemi Giriniz: ");
 scanf("%s",&islem);

 switch(islem)
 {
 case '+':
 sonuc=s1+s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '-':
 sonuc=s1-s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '/':
 sonuc=s1/s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '*':
 sonuc=s1*s2;
 printf("Sonuc: %d",sonuc);
 break;
 default: printf("Yanlis Deger Girdiniz");
 break;
 }

 return 0;
}
 
Kodunuzda bir sorun yok emin olmak için denedim:
1641127601002.png
 
Ben de hata goremedim. Ancak bazen derleyiciden derleyiciye degisebiliyor 16. satirdaki scanfdeki %s yi %c yapin belki sizde de duzgun calisabilir. Ancak pek de bir sey degismez bence. Handi derleyiciyi kullaniyorsunuz?
 
Kodda hata var tabii ki nasıl yok? adam char tanımlamış char 1 byte yer tutar, scanf ile string input alıyor ve char değişkenine yazıyor, konsoldan + ve enter e basıyorsun, scanf iki karakter girdi alıyor, dolayısıyla da stack üzerinde fazladan bir byte başka yere yazılıyor bu da sonuc değişkenin tutulduğu adrese denk geliyor muhtemelen.

şöyle yapınca düzgün çalışması lazım.
C:
#include <stdio.h>
#include <stdlib.h>

int main() {

 int s1,s2,sonuc;
 char islem[2];

 printf("1. Sayiyi Giriniz: ");
 scanf("%d",&s1);

 printf("2. Sayiyi Giriniz: ");
 scanf("%d",&s2);

 printf("Islemi Giriniz: ");
 scanf("%s", islem);

 switch(islem[0])
 {
 case '+':
 sonuc=s1+s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '-':
 sonuc=s1-s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '/':
 sonuc=s1/s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '*':
 sonuc=s1*s2;
 printf("Sonuc: %d",sonuc);
 break;
 default: printf("Yanlis Deger Girdiniz");
 break;
 }

 return 0;
}
 
islem adlı parametresini okumak için %c şeklinde parametresi tanımlanması gerek. Ancak %c dönüştürme belirteci, baştaki boşlukları otomatik olarak atlamaz, bu nedenle giriş esnasında (misal önceki bir girişteki int değerleri...) başıboş bir yeni satır varsa, scanf çağrısında onu hemen tüketir.

Sorunu çözmenin bir yolu, biçim dizesindeki dönüştürme belirtecinden önce bir boşluk bırakmaktır:
scanf(" %c", &islem);

Biçim dizesindeki boşluk, scanf'e baştaki boşlukları atlamasını söyler ve boşluk olmayan ilk karakter %c dönüştürme belirteci ile okunur.

C:
#include <stdio.h>
#include <stdlib.h>

int main() {

 int s1,s2,sonuc;
 char islem;

 printf("1. Sayiyi Giriniz: ");
 scanf("%d", &s1);

 printf("2. Sayiyi Giriniz: ");
 scanf("%d", &s2);

 printf("Islemi Giriniz: ");
 scanf(" %c", &islem);

 switch(islem)
 {
    case '+':
        sonuc=s1+s2;
        printf("Sonuc: %d",sonuc);
        break;
    case '-':
        sonuc=s1-s2;
        printf("Sonuc: %d",sonuc);
        break;
    case '/':
        sonuc=s1/s2;
        printf("Sonuc: %d",sonuc);
        break;
    case '*':
        sonuc=s1*s2;
        printf("Sonuc: %d",sonuc);
        break;
    default: printf("Yanlis Deger Girdiniz");
    break;
 }
 return 0;
}
 
Kodda hata var tabii ki nasıl yok? adam char tanımlamış char 1 byte yer tutar, scanf ile string input alıyor ve char değişkenine yazıyor, konsoldan + ve enter e basıyorsun, scanf iki karakter girdi alıyor, dolayısıyla da stack üzerinde fazladan bir byte başka yere yazılıyor bu da sonuc değişkenin tutulduğu adrese denk geliyor muhtemelen.

şöyle yapınca düzgün çalışması lazım.
C:
#include <stdio.h>
#include <stdlib.h>

int main() {

 int s1,s2,sonuc;
 char islem[2];

 printf("1. Sayiyi Giriniz: ");
 scanf("%d",&s1);

 printf("2. Sayiyi Giriniz: ");
 scanf("%d",&s2);

 printf("Islemi Giriniz: ");
 scanf("%s", islem);

 switch(islem[0])
 {
 case '+':
 sonuc=s1+s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '-':
 sonuc=s1-s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '/':
 sonuc=s1/s2;
 printf("Sonuc: %d",sonuc);
 break;
 case '*':
 sonuc=s1*s2;
 printf("Sonuc: %d",sonuc);
 break;
 default: printf("Yanlis Deger Girdiniz");
 break;
 }

 return 0;
}
Teşekkürler. 👏


islem adlı parametresini okumak için %c şeklinde parametresi tanımlanması gerek. Ancak %c dönüştürme belirteci, baştaki boşlukları otomatik olarak atlamaz, bu nedenle giriş esnasında (misal önceki bir girişteki int değerleri...) başıboş bir yeni satır varsa, scanf çağrısında onu hemen tüketir.

Sorunu çözmenin bir yolu, biçim dizesindeki dönüştürme belirtecinden önce bir boşluk bırakmaktır:
scanf(" %c", &islem);

Biçim dizesindeki boşluk, scanf'e baştaki boşlukları atlamasını söyler ve boşluk olmayan ilk karakter %c dönüştürme belirteci ile okunur.

C:
#include <stdio.h>
#include <stdlib.h>

int main() {

 int s1,s2,sonuc;
 char islem;

 printf("1. Sayiyi Giriniz: ");
 scanf("%d", &s1);

 printf("2. Sayiyi Giriniz: ");
 scanf("%d", &s2);

 printf("Islemi Giriniz: ");
 scanf(" %c", &islem);

 switch(islem)
 {
    case '+':
        sonuc=s1+s2;
        printf("Sonuc: %d",sonuc);
        break;
    case '-':
        sonuc=s1-s2;
        printf("Sonuc: %d",sonuc);
        break;
    case '/':
        sonuc=s1/s2;
        printf("Sonuc: %d",sonuc);
        break;
    case '*':
        sonuc=s1*s2;
        printf("Sonuc: %d",sonuc);
        break;
    default: printf("Yanlis Deger Girdiniz");
    break;
 }
 return 0;
}
Teşekkürler. 👏 Bir sorum olacak size %c hangi parametre için kullanılıyordu? Gördüm hatırlamıyor muyum emin değilim yarın sınav var kafam çorba gibi oldu.
 

Yeni konular

Geri
Yukarı