C getchar() 刽子手游戏
Posted
技术标签:
【中文标题】C getchar() 刽子手游戏【英文标题】:C getchar() hangman game 【发布时间】:2017-02-24 08:25:50 【问题描述】:我接到了一项家庭作业,任务是创建一个简单的刽子手游戏。下面是我的代码。我目前正在尝试使用 if else 和getchar()
来要求用户输入一个小写字母,看看它是否与他们应该猜测的单词中的一个字母匹配。根据我非常有限的经验,我拥有的代码应该可以工作,当我逐步执行程序时,它看起来好像应该正常运行,但是当我实际运行程序时,它似乎跳过了第二个getchar()
。有人有什么建议或帮助吗?
#include "stdio.h"
#include "math.h"
int main(void)
int(a);
int(b);
float(x);
float(c);
float(e);
int word[4] = 116, 101, 115, 116;
int guess[4];
c == 0;
a == 0;
b == 0;
printf("Welcome to Hangman\n");
printf("Input a word--one lower case letter at a time\n");
printf("Enter Guess: ");
x = getchar();
if (x > 122)
printf(" Error, character must be a lowercase letter");
else
if (x < 97)
printf(" Error, character must be a lowercase letter");
else
if (x == 116)
printf("t is correct\n");
printf("%d", word[0]);
printf(" _");
printf(" _");
printf(" %d ", word[3]);
e = getchar();
if (e == 101)
printf("e is correct\n");
printf("%d", word[0]);
printf(" %d", word[1]);
printf(" _");
printf(" %d ", word[3]);
else
if (e == 115)
printf("s is correct\n");
printf("%d", word[0]);
printf(" _");
printf(" %d", word[2]);
printf(" %d", word[0]);
else
printf(" You guessed wrong");
else
if (x == 101)
printf("e is correct\n");
printf("_");
printf(" %d", word[1]);
printf(" _");
printf(" _ ");
else
if (x == 115)
printf("s is correct\n");
printf("_");
printf(" _");
printf(" %d", word[2]);
printf(" _ ");
else
printf(" You guessed wrong");
【问题讨论】:
什么是int(a);
...您的声明对于初学者来说不正确...尝试int a;
另外a == 0;
是a
与零的比较,不是 将零分配给 a
,试试a = 0;
这是垃圾代码。
c == 0;
等。不要做任何事情。
这里有几个问题。但您的主要问题是关于getchar()
。答案是您忘记了 NEWLINE 字符:Clarification needed regarding getchar() and newline
您不能为每个字符编写单独的 if 语句。这不是怎么做的。如果您发现自己再次编写同一行代码,那么您可能做错了什么。
【参考方案1】:
当你输入一个你想让getchar
读取的字符时,你用 Enter 键结束它,对吗? Enter 键将也作为换行符'\n'
放入stdin
(这是getchar
读取的内容)的输入缓冲区。
这意味着对于您给出的每个输入,您实际上输入了 两个 个字符。
您需要跳过该换行符。只需在第一个 getchar
之后添加第二个 getchar
即可轻松完成,例如
x = getchar();
getchar(); // Read the newline from the Enter key
【讨论】:
并且x
应该输入int
,这样您就可以在用户取消输入之前检查if (x == EOF) return 1;
,否则您将在第二个getchar
上被阻止第二个getchar
.【参考方案2】:
已经有一个很好的答案,但要澄清
问题有点多,这里是一段简单的代码。
函数 get_character 将返回第一个输入的字符
并消耗所有后续字符,直到下一个'\n'
。
如果一个字符是EOF,它不会阻塞。
#include<stdio.h>
int get_character(void);
int main(void)
printf("character > ");
int c = get_character();
while(c != EOF && c != 'q')
printf("You entered %c\n", c);
printf("character > ");
c = get_character();
int get_character(void)
int c = getchar(), next_c;
if(c == EOF)
return EOF;
next_c = getchar(); // consume all \n
while(next_c != '\n' && next_c != EOF)
fprintf(stderr, "WARNING: consumed non-newline character: 0x%x\n", next_c);
next_c = getchar();
return c;
顺便说一句:你可以更快地解决刽子手的方式:
int get_character(void);
#define MAX_TRIALS 3
#define WORD_LEN 4
int main(void)
char word[WORD_LEN + 1] = "test";
char correct[WORD_LEN] = 0, 0, 0, 0;
int trials = 0;
while(1)
if(trials > MAX_TRIALS)
printf("You failed. The word was: %s\n", word);
return 0;
printf("character > ");
int c = get_character();
if(c == EOF)
printf("bye\n");
return 0;
int i, this_char_correct = 0;
for(i = 0; i < WORD_LEN; i++)
if(c == word[i])
correct[i] = 1;
this_char_correct = 1;
if(correct[i])
printf("%c", word[i]);
else
printf("_");
if(!this_char_correct)
trials++;
int word_done = 1;
for(i = 0; i < WORD_LEN; i++)
word_done &= correct[i];
if(! word_done)
printf("\nYou have %d trials left\n", WORD_LEN - trials);
else
printf("\nYou got it.\n");
return 0;
这只是一段概念验证代码,可能有更优雅的方法来解决这个问题。
【讨论】:
以上是关于C getchar() 刽子手游戏的主要内容,如果未能解决你的问题,请参考以下文章