c - 为什么我的代码会跳过用户的输入?

标签 c debugging

<分区>

所以这是我写的一些代码,我是从 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++;
        }
    }
}

最佳答案

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

stdin 包含您输入标准输入设备的所有内容;在您的例子中,这是键盘。

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

您在 playgame 中的代码处理 =,但它在 stdin 上留下了 Enter... 因此,您对 getchar 的下一次调用会拉取它。

您需要做的是刷新 stdin 流。你不能使用 fflush(stdin)为此,fflush 用于输出流。

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

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

在您提问之前清除缓冲区中所有旧的换行符。

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

所以:

flushSTDIN();
printf("is your number %d ?", guessnumber);
x = getchar();

关于c - 为什么我的代码会跳过用户的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14719402/

相关文章:

c - 进程阻塞了哪些调用?

c - 字符串数组和 Gnome 排序

c# - System.NullReferenceException - 但调试器显示值不为空

c++ - visual studio 在 Debug模式下附加到进程

c - 将多个数据加载到命令行 c

c++ - int num = *(int *)number;这是做什么的?

考虑程序输出

java - 命令行 Java 调试器

c# - 使用 Visual Studio 2019 在本地调试 Azure Function

c++ - 如果 bug 没有持续明显地出现,如何查看它是否仍然存在?