基本的 C 刽子手代码问题
Posted
技术标签:
【中文标题】基本的 C 刽子手代码问题【英文标题】:Basic C hangman code problems 【发布时间】:2015-01-22 11:46:45 【问题描述】:大家好,我正在学习 C,我开始编写 Hangman Game。那应该播放超过 1 个单词,我选择了“informatik”。
我想要做的是询问用户名,然后开始。
#include<stdio.h>
int main()
int correct = 0;
int mistake = 0;
int number = 0;
char name[20];
char Word[]='i','n','f','o','r','m','a','t','i','k';
char guessStatus[]='_','_','_','_','_','_','_','_','_','_','\0';
char guess;
printf("##### Welcome to Hangman #####\nWhat is your Name?\n");
scanf(" %s", name);
fflush(stdin);
printf("Hello %s!\n", name);
while (mistake <=10 && number<10)
printf("Guess a letter: ");
guess = getchar();
printf("%c", guess);
correct = 0;
for (int search=0; search<10; search++)
if (guess == Word[search])
number++;
guessStatus[search] = Word[search];
correct = 1;
if (correct == 0)
mistake++;
printf("%c is wrong!\nYour Status is: %s\nYou have %i tries left\n", guess,guessStatus,10-mistake);
else
printf("Good job %s!\nYour Status is: %s\nYou have %i tries left\n", name,guessStatus,10-mistake);
问题是当我运行代码并输入任何字母时,程序也将“输入”视为一个字母。我使用 fflush(stdin) 作为希望,即使我对此一无所知但没有工作:) 问题输出如下:
欢迎来到刽子手你叫什么名字? 约翰 你好约翰! 猜一个字母:
错了! 您的状态是:__________ 你还有 9 次尝试 猜一个字母:我 i干得好,约翰! 您的状态是:i________i_ 你还有 9 次尝试 猜一个字母:
错了! 您的状态是:i________i_ 您还剩 8 次尝试
我不知道如何处理它。非常感谢帮助。
【问题讨论】:
“它 [..] 不起作用”是什么意思?它崩溃了吗?你收到错误信息了吗?什么错误?fflush(stdin)
是未定义的行为
如果您不想“输入”算作一个字母,那么添加if (guess=='\n') continue;
或类似的东西。但最好检查字母:if (guess < 'a' || guess > 'z')
,但细节会因您的语言环境和词汇而异。
它没有崩溃。它实际上有效,但工作错误。当我输入任何正确的单词时,例如“i”。首先它将“i”计为正确并放入guessStatus,并且错误编号不会改变。然后(不再输入任何字母)它会将“Enter”键视为一个字母并且它是错误的。
c-faq.com/stdio/scanfinterlace.html
【参考方案1】:
添加 gethcar();可以阅读 \n:
#include <stdio.h>
int main()
int correct = 0;
int mistake = 0;
int number = 0;
char name[20];
char Word[]='i','n','f','o','r','m','a','t','i','k';
char guessStatus[]='_','_','_','_','_','_','_','_','_','_','\0';
char guess;
printf("##### Welcome to Hangman #####\nWhat is your Name?\n");
scanf(" %s", name);
getchar(); // add this line
printf("Hello %s!\n", name);
while (mistake <=10 && number<10)
printf("Guess a letter: ");
guess = getchar();
printf("%c", guess);
correct = 0;
for (int search=0; search<10; search++)
if (guess == Word[search])
number++;
guessStatus[search] = Word[search];
correct = 1;
if (correct == 0)
mistake++;
printf("%c is wrong!\nYour Status is: %s\nYou have %i tries left\n", guess,guessStatus,10-mistake);
else
printf("Good job %s!\nYour Status is: %s\nYou have %i tries left\n", name,guessStatus,10-mistake);
【讨论】:
是的工作:) 我也必须把它放到while语句中(在guess=getchar();和printf("%c",guess);之间。但是为什么?用户不应该输入他的话用“输入”键? Googel "scanf line buffer" 就知道了。【参考方案2】:试试这个应该可以的 使用
scanf(" %c",&guess);
而不是
guess = getchar(); //remove this line
printf("%c", guess); //remove this line also
【讨论】:
以上是关于基本的 C 刽子手代码问题的主要内容,如果未能解决你的问题,请参考以下文章