Soru Scanf () sorunundan önce C / C ++ printf ()


Ben C / C ++ kodlamak için Eclipse kullanıyorum ve oldukça kolay bir şey olabilir ile mücadele ediyorum. Aşağıdaki kodumda kullanıyorum printf() ve sonra scanf(). althougth printf daha önce yazılmıştır scanf() çıkış farklıdır. Benzer konuyla ilgili bir şey öğrenebildim İşte. Ama çözemedim. Herhangi bir fikir?

Kod:

#include <stdio.h>

int main()
{
    int myvariable;

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

Beklenen çıktı:

Enter a number:1
1

Bunun yerine şunu elde ederim:

1
Enter a number:1

21
2018-06-01 21:08


Menşei


Sorunuz kafa karıştırıcı: "Aşağıdaki kodumda printf () ve scanf () 'den sonra kullanıyorum. "printf scanf () önce yazılmıştır". Kodun içine koyduğun şey bu değil. Lütfen sorunuzu yeniden yazınız. - Elazar
Kodun benim için çalışıyor. - spartygw
Haklısın üzgünüm. Demek istediğim, ilk önce bir şey yazdırmak istiyorum, bu durumda: printf ("Bir sayı girin:"); Ardından klavyeden sayıyı okuyun. Ve sonra sayıyı konsola yazdırın. Ancak bunun yerine programı çalıştırdıktan sonra hiçbir şey yazdırılamaz ve program giriş için bekler. Girdiyi aldıktan sonra program, hem "Bir numara girin:" hem de numarayı basar. - quapka
Bilmiyorum. Belkide yanlış eklentilerim var. Daha önce yazdığım gibi, ben de bunun için yeni bir şeyim var ve Eclipse'de C / C ++ 'ı nasıl ayarlayacağımız konusunda birkaç dersi takip ettim. Belki her şeyi kaldırmak ve yeni bir başlangıçtan başlamak için daha iyi olacaktır. - quapka


Cevaplar:


Çıktınız tamponlu. 4 seçeneğiniz var:

  1. açık floş

    fflush Her yazmadan sonra tampondan kar etmek ve istenen davranışı / ekranı açık bir şekilde zorlamak.

    fflush( stdout );
    
  2. arabelleğe sadece arabellek hatlarına sahip olmak

    Sadece tam satırları yazdırmanın yeterli olduğunu bildiğiniz zamanlar için yararlıdır

    setlinebuf(stdout);
    
  3. arabelleği devre dışı bırak

    setbuf(stdout, NULL);
    
  4. Konsolunuzdaki arabelleği, sunduğu seçenekler menüsü ile


Örnekler:

Seçenek 1 ile kodunuz:

#include <stdio.h>
int main() {

    int myvariable;

    printf("Enter a number:");
    fflush( stdout );
    scanf("%d", &myvariable);
    printf("%d", myvariable);
    fflush( stdout );

    return 0;
}

İşte 2:

#include <stdio.h>
int main() {

    int myvariable;

    setlinebuf(stdout);    

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

ve 3:

#include <stdio.h>
int main() {

    int myvariable;

    setbuf(stdout, NULL);     

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

24
2018-06-01 21:27



Teşekkürler. İlk seçenek işe yarıyor. Ama yine de, daha uzun ve daha karmaşık kodlar yazmayı düşünürsek oldukça karmaşık bir çözüm gibi görünüyor. Yani, işi ikiye katlamak gibi. Ancak dördüncü deneyin. - quapka
Eğer arabelleğe almayı umursamıyorsanız ve mümkün 3 seçenekle gidebileceğiniz faydalar. Tek liner (programınızda sadece bir kez ayarlandı ve bitti). Kod 4 hiç istemiyorsanız veya değiştiremezseniz, Seçenek 4 bir alternatiftir. Seçenek 2 muhtemelen yeni satır yoksa girişinizi güvenilir bir şekilde yankılamayacaktır. - zsawyer
Her biri printf("%d", myvariable); satırlar sonunda bir satırsonu ile daha iyi olurdu. Tek satırlık bir çıktı parçacığını bilinçli olarak oluşturuyorsanız, yalnızca yeni satırı atlayın. - Jonathan Leffler


Tamam, nihayet, @zsawyer'in 3 etiketli bir seçenek olarak yazdığı şeye benzer bir şey kullandım. Kodumda bu satırı ekledim:

setvbuf(stdout, NULL, _IONBF, 0);

Main () 'daki ilk satır olarak:

#include <stdio.h>

int main()
{
    setvbuf(stdout, NULL, _IONBF, 0);

    int myvariable;

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

Onu aldım İşte.


5
2018-06-01 21:54