基本的 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 &lt; 'a' || guess &gt; '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 刽子手代码问题的主要内容,如果未能解决你的问题,请参考以下文章

C尖刽子手游戏+计数器

刽子手代码卡在三个不同的问题上

初学者的python刽子手代码

C Hangman 程序调试辅助(中止陷阱:6 错误)[关闭]

刽子手游戏(UVa489)

刽子手实现[重复]