C getchar()hang子手游戏
我被赋予了一项家庭作业任务,其任务是创建一个简单的hang子手游戏。以下是我的代码。我目前正在尝试使用getchar()
来请求用户输入一个小写字母,并查看它是否与他们应该猜测的单词中的某个字母匹配。从我非常有限的经验来看,我拥有的代码应该可以工作,并且当我逐步完成程序时,它看起来应该正常运行,但是当我真正运行该程序时,似乎跳过第二个getchar()
。任何人有任何建议或帮助?C getchar()hang子手游戏
#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");
}
}
当你输入你想getchar
读取一个字符,你用结束它进入关键吧?那输入键将也被放入输入缓冲区stdin
(这是什么getchar
读取)作为换行符,'\n'
。
这意味着对于您输入的每个输入,您实际上输入了两个个字符。
您需要跳过该换行符。这很容易只需添加第二getchar
第一后,例如像做
x = getchar();
getchar(); // Read the newline from the Enter key
而'x'应该输入'int',这样你可以检查if(x == EOF){return 1; }'在用户取消输入**之前**你的第二个'getchar'或者你将在第二个'getchar'上阻塞。 –
已经有一个很好的答案,但澄清 问题有点多,下面是一段简单的代码。 函数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;
}
}
}
这只是一张证明了概念代码有可能是解决这种方式更优雅的方式。
什么是int(a);你的声明对于初学者是不正确的...尝试'int a;'也是'a == 0;'是'a'与零的比较,**不**为* * a *赋值零,尝试'a = 0;' –
这是垃圾代码。 –
'c == 0;'等人。不要做任何事情。 – Biffen