0

所以这是我写的一些代码,我是从 c 开始的大麦,所以请耐心等待,我的代码对我来说很有意义,但它不能正常工作,当我试图拒绝停止播放并显示平均值时,它会重复播放功能。

基本上,我的程序从 1 到 100 猜测用户编号,无论用户想出什么数字。这是一些错误的输出,只是为了给您一个想法。玩游戏功能运行良好,但不是主要功能。

Playing guess my number game 

is your number 50 ?=
Great!
Play again? (y for yes n for no): is your number 50 ?=
Great!
Play again? (y for yes n for no): is your number 50 ?n

等等我找不到我出错的地方有什么建议吗?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int playgame(void);
main() {
   int numberofplays = 0;
   float average = 0;
   int numberguesses = 0;

   printf("Playing guess my number game\n");
   printf("-------------------------------\n");
   bool play = true;
   int xtry = 0;
   int totaltries = 0;
   char answer;
   do {
       xtry = playgame();
       numberofplays++;
       totaltries = totaltries + xtry;
       printf("Play again? (y for yes n for no): ");
       answer = getchar();
       if(answer =='n')
                play = false;

    } while(play==true);

    average = (float)(totaltries/numberofplays);
    printf("average is %f tries per game\n",average);
    return 0;
} 
int playgame(void) {
    int guessnumber = 50;
    int xnumber = 25;
    int count=0;
    char x;
    bool stillguessing = true;

    while(stillguessing == true) {
        printf("is your number %d ?", guessnumber);
        x = getchar();

        if(x=='=') {
            count++;
            printf("Great!\n");
            stillguessing=false;
            return count;
        }
        else if(x == '<') {
            guessnumber = guessnumber - xnumber;
            xnumber = xnumber/2;
            if(xnumber<1) xnumber = 1;
            count++;
        }
        else if (x == '>') {
             guessnumber = guessnumber +xnumber;
             xnumber = xnumber/2;
             if(xnumber<1) xnumber = 1;
             count++;
        }
    }
}
4

2 回答 2

2

该函数getchar从流中提取一个字符stdin

该流stdin包含您输入到标准输入设备中的所有内容;在你的情况下,这是键盘。

现在,当您响应计算机的猜测时,您按下两个键。您按=,然后Enter

您在中的代码playgame处理了=,但它保留了Enteron stdin... 因此,您的下一次调用将getchar拉动它。

您需要做的是刷新stdin流。你不能用fflush(stdin)这个,就像fflush输出流一样。

相反,您可以使用类似的东西

void flushSTDIN() {
    while ((ch = getchar()) != '\n' && ch != EOF);
}

在您提出问题之前清除缓冲区中的任何旧换行符。

您应该在程序中的所有调用之前执行此操作getchar

所以:

flushSTDIN();
printf("is your number %d ?", guessnumber);
x = getchar();
于 2013-02-06T00:36:54.777 回答
1

您的问题是getchar()正在消耗输入中的单个字符。但是,当您输入响应时,输入流始终包含至少两个字符:您输入的字符(例如'=')和它后面的换行符(或回车符)。

这在函数中并不重要playgame()(尽管所有提示都打印了两次),但是当你到达

answer = getchar();

此调用getchar()获取您键入的前一个字符留下的换行符。

如何解决这个问题是您希望如何处理用户输入的问题 - 是否要验证它,是否希望能够输入更长的字符串等。

在您的情况下,最简单的解决方案是将您的调用替换为getchar()将丢弃空格的循环。

我建议执行以下操作:

在程序开始处(或附近)添加以下行:

#include <ctype.h>

这提供了isspace()干净且可移植地检查字符是否为空格的功能。

换行:

answer = getchar();

和:

while (isspace(answer = getchar()))
    ;

同样,替换

x = getchar();

和:

while (isspace(x = getchar()))
    ;

单个分号是一个空语句-某些东西(在这种情况下没有)必须进入循环体。

分配给x/answer在一个条件内通常会不受欢迎,但在这种特殊情况下,这是最惯用的写法。

请注意,不正确的宏实现可能会通过多次isspace()评估调用来导致问题getchar()

于 2013-02-06T00:40:17.093 回答