2017-09-17 9 views
0

私はちょうどCを学んでいて、とてもシンプルでハックなハングマンゲームを作った。私が理解できないことは、私が推測するたびに期待されるアウトプットが倍増する理由です。このCプログラムでprintf出力が2倍になるのはなぜですか?

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    setbuf(stdout, NULL); 
    char word[] = "pretzels"; 
    char guessed[50]; 
    memset(guessed, '0', sizeof(guessed)); 
    int len; 
    char guess; 
    char buf; 
    len = strlen(word); 
    int j; 

    printf("Welcome to Hangman!\n"); 
    for (int i=0; i<len; i++) { 
    if (guessed[i] != '0') { 
     printf("%c ", word[i]); 
    } 
    else { 
     printf("_ "); 
    } 
    } 
    while(memcmp(word, guessed, len) != 0) { 
    printf("\nGuess a letter: "); 
    scanf("%c", &guess); 

    for (j=0; j<len; j++) { 
     if (word[j] == guess && word[j] != guessed [j]) { 
     guessed[j] = guess; 
     break; 
     } 
    } 
    for (int i=0; i<len; i++) { 
     if (guessed[i] != '0') { 
     printf("%c ", word[i]); 
     } 
     else { 
     printf("_ "); 
     } 
    } 
    } 
    printf("\nYou got it!"); 
    return 0; 
} 

このプログラムの出力は次のようになります...

Welcome to Hangman! 
_ _ _ _ _ _ _ _ 
Guess a letter: p 
p _ _ _ _ _ _ _ 
Guess a letter: p _ _ _ _ _ _ _ 
Guess a letter: r 
p r _ _ _ _ _ _ 
Guess a letter: p r _ _ _ _ _ _ 
Guess a letter: e 
p r e _ _ _ _ _ 
Guess a letter: p r e _ _ _ _ _ 

等...の出力が開始されるたびに、再びそれが右のscanf関数の前の行を印刷し、はscanf関数をスキップし、その後、単語/スペースを再び描画するforループを実行します。

出力が倍増するのはなぜですか?私は何かを欠いているに違いない。

+0

あなたが入力したものとscanfが読み取るものについて考えてみましょう。 – prl

+2

Scanfはインタラクティブ入力には適していません。その代わりに何を使うべきかについてここにはたくさんの答えがあります。 – prl

+0

@ArtemBarger言語で余分な機能を持つことは良いことです。 – CroCo

答えて

0

scanfの直後に_flushall()を使うことができます。バッファはchar文字を取得することを期待しています。また、charを入力するとcharを入力しても入力します。

+0

これは、_flushall();のような意味です。 – piscoony

関連する問題