私はちょうど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ループを実行します。
出力が倍増するのはなぜですか?私は何かを欠いているに違いない。
あなたが入力したものとscanfが読み取るものについて考えてみましょう。 – prl
Scanfはインタラクティブ入力には適していません。その代わりに何を使うべきかについてここにはたくさんの答えがあります。 – prl
@ArtemBarger言語で余分な機能を持つことは良いことです。 – CroCo