Ubuntu Türkiye

Yazılım => Programlama => C/C++ => Konuyu başlatan: edge35 - 09 Nisan 2017 - 16:17:19

Başlık: [Çözüldü] scanf-if-scanf almama
Gönderen: edge35 - 09 Nisan 2017 - 16:17:19
Bir "c" kodu yazdım, fakat istediğim gibi çalışmıyor. Nedenini bir türlü anlayamadım. Yardımcı olabilirseniz sevinirim.
İştediğim çıktı şu şekilde olmalıydı:
$ ./b2
m c m d
operation 'm'
operation 'c'
operation 'c-m'
Done!


Fakat çıktı şu şekilde oluyor:
$ ./b2
m c m d
operation 'm'
operation 'c'
ERROR_1
operation 'm'
Done!


Kodum aşağıdaki şekilde:
#include <stdio.h>
#include <math.h>
int main()
{
char operation;

while(operation != 'd')
{
scanf("%c",&operation);

if (operation == 'm')
{
printf("operation 'm'\n");
}

else if (operation == 'c')
{
printf("operation 'c'\n");

scanf("%c",&operation);

if (operation == 'm')
{
printf("operation 'c-m'\n");
}

else printf("ERROR_1\n");
}
}
printf("Done!\n");
return 0;
}



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 09 Nisan 2017 - 16:40:43

Düzeltme: Sanırsam sebebini anladım, scanf("%c",&operation); işlemini yapınca hiç bir şey yapmadan bir kez dönüyor, ikinci dönüşte if( ; ; )'leri kontrol ediyor. Ama sebebini anlayamadım.


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 09 Nisan 2017 - 23:09:50

Yardımcı olabilecek yok mu?
Başlık: Ynt: scanf-if-scanf almama
Gönderen: guestwho - 14 Nisan 2017 - 19:32:37
#include<stdio.h>

int main()
{
char operation, last;

while(operation != 'd')
{
scanf(" %c",&operation);

if (last == 'c' && operation == 'm') {
printf("operation 'c-m'\n");
} else if (operation == 'c') {
last = 'c';
printf("operation 'c'\n");
} else if (operation == 'm') {
last = 'm';
printf("operation 'm'\n");
} else if (operation != 'd') {
printf("ERROR_1\n");
}
}

printf("Done!\n");
return 0;
}


Bu şekilde istediğin gibi çalışıyor sanırım. "last" değişkenini ekledim, "if-else" bloklarını düzenledim ve bir de "scanf" fonksiyonu içerisinde " %c" parametresini boşluk ile kullandım.
Başlık: Ynt: scanf-if-scanf almama
Gönderen: edge35 - 14 Nisan 2017 - 22:59:36
[mention=622903]@guestwho[/mention] emek verdiğiniz için teşekkür ederim, aslında ben de çalışması için benzr bir şeyler yapıp hallettim fakat ben aslında sorunun sebebini öğrenmek istiyorum.
Başlık: Ynt: scanf-if-scanf almama
Gönderen: guestwho - 15 Nisan 2017 - 00:14:35
Sorun "scanf" fonksiyonunun döngü içerisinde ardışıl çağırılmasından kaynaklanıyormuş. Şöyle ki; ilk çağrıda "scanf" fonksiyonu karakter girdisini kabul ettiği gibi enter tuşuna basıldığında yeni satır karakterini ("\n") önbellekte tutuyor. Sonraki çağrılarda bu yeni satır karakteri bir şekilde girdinin başına ekleniyor. Bu yüzden "scanf" fonksiyonu çağırılırken " %c" parametresinden önce tek boşluk bırakılırsa önbellekteki yeni satır karakteri gibi görünmeyen karakterler temizlenmiş oluyor. Bunun gibi sorunlarla sık karşılaşıldığı için genelde "scanf" fonksiyonunun muadillerinin kullanılması önerilir.
Başlık: Ynt: scanf-if-scanf almama
Gönderen: edge35 - 15 Nisan 2017 - 00:36:47
Alıntı yapılan: guestwho - 15 Nisan 2017 - 00:14:35
Sorun "scanf" fonksiyonunun döngü içerisinde ardışıl çağırılmasından kaynaklanıyormuş. Şöyle ki; ilk çağrıda "scanf" fonksiyonu karakter girdisini kabul ettiği gibi enter tuşuna basıldığında yeni satır karakterini ("\n") önbellekte tutuyor. Sonraki çağrılarda bu yeni satır karakteri bir şekilde girdinin başına ekleniyor. Bu yüzden "scanf" fonksiyonu çağırılırken " %c" parametresinden önce tek boşluk bırakılırsa önbellekteki yeni satır karakteri gibi görünmeyen karakterler temizlenmiş oluyor. Bunun gibi sorunlarla sık karşılaşıldığı için genelde "scanf" fonksiyonunun muadillerinin kullanılması önerilir.
bilgilendirme için çok teşekkür ederim, bayadır aklımı kurcalıyordu, yeni bir şey daha öğrenmiş oldum.