C kod'unun neresinde hata var?

George Krieger

Katılımcı Üye
8 Şub 2022
461
122
#include<stdio.h> kütüphaneler kodun içinde.
#include<math.h>

Kod:
int main(){

   printf("hesap makinası\n");
char optr;
int fnum, snum;
printf("işlem seçiniz: (+, -, *,/)");
scanf("%c",&optr);

printf("2 sayı giriniz: \n");
scanf("%d %d", &fnum, &snum);


switch(optr){

case '+':
printf("%d + %d"  ,fnum + snum);
break;

case '-':
printf("%d - %d"  ,fnum + snum);
break;

case '*':
printf("%d * %d"  ,fnum + snum);
break;

case '/':
printf("%d / %d"  ,fnum + snum);
break;

default:
printf("hatalı!!")
}
return 0;
}

çıktısı:
{"hesap makinası
işlem seçiniz: (+, -, *,/)+
2 sayı giriniz:
23
12
35+1872491232% " }
merhaba arkadaşlar, c'de bu kodu derleyince cevabın yanına artı olarak bu geliyor "+1872491232%" sebebi nedir? teşekkür ederim iyi çalışmalar.
birde c programlama öğrenmeye başladım bunun ile ilgili bilmediğim şeyler çok, bunlarlar ilgili çok soru sormak forumda yasak mıdır?
 

George Krieger

Katılımcı Üye
8 Şub 2022
461
122
printf("%d / %d" ,fnum + snum);

case'lerdeki printf komutlarında + kullanmışsın. yapmak istedğini tam anlayamadım ama doğrusu şöyle olmalıydı:

printf("%d / %d" ,fnum, snum);
öncelikle teşekkür ederim ;hesap makinası yapmaya çalışıyordum. "optr" değişkeninden hangisini seçerse o işlemi yaptırmaya çalışmıştım. dediğin gibi yapınca 34 ve 23'ü girersek "34 + 23%" çıktısı şöyle oluyor. benim yazdığımda ise cevabın yanında fazlalık olarak sayılar yazıyordu.
 

Napcaz

Katılımcı Üye
28 Nis 2019
767
769
Cudi
printf in ilk argümanı olan format string içine koyulan string i olduğu gibi bastırır sadece format specifier dediğimiz yer tutucuları kullanarak bu string in istediğin yerlerine değişkenlerde tuttuğun değerleri yerleştirebilirsin. sense iki tane yer tutucu kullanmızsın eğer iki yer tutucu kullanıyorsan iki tane extra argümen vermen gerekir ama aksi gibi bir tane veriyorsun. buda diğer format specifier in stack ten rastgele bir değer almasına neden oluyor. Örnek olarak case '+' yı veriyim, doğru kod bu şekilde olmalı:

printf("%d + %d" ,fnum + snum);
printf("%d", fnum + snum);
 

George Krieger

Katılımcı Üye
8 Şub 2022
461
122
printf in ilk argümanı olan format string içine koyulan string i olduğu gibi bastırır sadece format specifier dediğimiz yer tutucuları kullanarak bu string in istediğin yerlerine değişkenlerde tuttuğun değerleri yerleştirebilirsin. sense iki tane yer tutucu kullanmızsın eğer iki yer tutucu kullanıyorsan iki tane extra argümen vermen gerekir ama aksi gibi bir tane veriyorsun. buda diğer format specifier in stack ten rastgele bir değer almasına neden oluyor. Örnek olarak case '+' yı veriyim, doğru kod bu şekilde olmalı:

printf("%d + %d" ,fnum + snum);
printf("%d", fnum + snum);
teşekkürler. kusura bakma yeni başladığımdan dediklerinin çoğunu anlayamadım. "string"(%s) char'ın metinsel ifadelerini tutmak veya yazdırmak için kullanılmıyormuydu?
"iki tane extra argümen vermen gerekir"
bu kısmıda anlayamadım,
peki sonuna neden "%" işareti geliyor?
"printf("%d", fnum + snum);"
burada iki değişkenin değerini toplayıp tam sayı olarak ekrana bas mı demek istiyor?
 

Napcaz

Katılımcı Üye
28 Nis 2019
767
769
Cudi
teşekkürler. kusura bakma yeni başladığımdan dediklerinin çoğunu anlayamadım. "string"(%s) char'ın metinsel ifadelerini tutmak veya yazdırmak için kullanılmıyormuydu?

bu kısmıda anlayamadım,
peki sonuna neden "%" işareti geliyor?
"printf("%d", fnum + snum);"
burada iki değişkenin değerini toplayıp tam sayı olarak ekrana bas mı demek istiyor?
bizim string derken kast ettiğimiz char ların array oluşturması bunu sizde biliyorsunuzdur. printf in ilk argümanı string tir biz buna özel olarak format string deriz adı gibi düşünebilirsiniz, bundan sonraki argümanlar opsiyoneldir ve ilk argüman olan format string in içine başka stringleri yada char ları yada integer ları doldurmak için kullanılırlar. Bu argümanları kullanmak için ilk argümanımızın içinde bizim format specifier dediğimiz halk arasında yer tutucu denilen ifadelerı kullanırız bunlar ikinci, üçüncü, dördüncü ve sonraki argümanların sırayla hangi veri tip i formatıyla format string de nereye koyulucağını göstermemize yarar. format specifier lar başında % olan ve sonraki harf(ler)i ile başka başka veri tiplerini ifade eden yapılardır.
 

George Krieger

Katılımcı Üye
8 Şub 2022
461
122
bizim string derken kast ettiğimiz char ların array oluşturması bunu sizde biliyorsunuzdur. printf in ilk argümanı string tir biz buna özel olarak format string deriz adı gibi düşünebilirsiniz, bundan sonraki argümanlar opsiyoneldir ve ilk argüman olan format string in içine başka stringleri yada char ları yada integer ları doldurmak için kullanılırlar. Bu argümanları kullanmak için ilk argümanımızın içinde bizim format specifier dediğimiz halk arasında yer tutucu denilen ifadelerı kullanırız bunlar ikinci, üçüncü, dördüncü ve sonraki argümanların sırayla hangi veri tip i formatıyla format string de nereye koyulucağını göstermemize yarar. format specifier lar başında % olan ve sonraki harf(ler)i ile başka başka veri tiplerini ifade eden yapılardır.
peki çıktının sonuna neden otamatik olarak "%" işareti geliyor, onu nasıl giderebiliriz.
 

Napcaz

Katılımcı Üye
28 Nis 2019
767
769
Cudi
Kodunuzda case default kısmındaki printf ifadesinde ";" işaretini unutmuşsunuz bunu düzeltmeniz lazım ayrıca scanf i bu haliyle kullanmanız güvenli değil overflow saldırısı yapılabilir programınıza ama siz test amaçlı yazdığınız için o kısım çok önemli değil. Size yukarda yazdığım şekilde eğer kodunuzu düzeltseydiniz:

C:
#include <stdio.h>

int main() {

    printf("hesap makinasi\n");
    char optr;
    int fnum, snum;
    printf("islem seciniz: (+, -, *,/)");
    scanf("%c", &optr);

    printf("2 sayi giriniz: \n");
    scanf("%d %d", &fnum, &snum);


    switch (optr) {

    case '+':
        printf("%d", fnum + snum);
        break;

    case '-':
        printf("%d", fnum + snum);
        break;

    case '*':
        printf("%d", fnum + snum);
        break;

    case '/':
        printf("%d", fnum + snum);
        break;

    default:
        printf("hatali!!");
    }
    return 0;
}

Kodun problemsiz şekilde çalıştığını ve % falan çıkartmadığını görürdünüz.
 

George Krieger

Katılımcı Üye
8 Şub 2022
461
122
Kodunuzda case default kısmındaki printf ifadesinde ";" işaretini unutmuşsunuz bunu düzeltmeniz lazım ayrıca scanf i bu haliyle kullanmanız güvenli değil overflow saldırısı yapılabilir programınıza ama siz test amaçlı yazdığınız için o kısım çok önemli değil. Size yukarda yazdığım şekilde eğer kodunuzu düzeltseydiniz:

C:
#include <stdio.h>

int main() {

    printf("hesap makinasi\n");
    char optr;
    int fnum, snum;
    printf("islem seciniz: (+, -, *,/)");
    scanf("%c", &optr);

    printf("2 sayi giriniz: \n");
    scanf("%d %d", &fnum, &snum);


    switch (optr) {

    case '+':
        printf("%d", fnum + snum);
        break;

    case '-':
        printf("%d", fnum + snum);
        break;

    case '*':
        printf("%d", fnum + snum);
        break;

    case '/':
        printf("%d", fnum + snum);
        break;

    default:
        printf("hatali!!");
    }
    return 0;
}

Kodun problemsiz şekilde çalıştığını ve % falan çıkartmadığını görürdünüz.
dediğiniz değişiklikleri yaptım hatta acaba beceremedim mi diye sizin kodunuzu bile derledim yine % işareti çıkıyor, şöyle oluyor.
hesap makinasi
islem seciniz: (+, -, *,/)+
2 sayi giriniz:
34
23
57% <----- şundan bahsediyordum.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.