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

C 为什么我的代码会跳过用户的输入?,c,debugging,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 num

这是我写的一些代码,我是从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++;
        }
    }
}
#包括
#包括
#包括
#包括
智力游戏(无效);
main(){
int numberofplays=0;
浮动平均值=0;
int numberguesss=0;
printf(“玩猜我的数字游戏”\n);
printf(“------------------------------------\n”);
bool play=true;
int-xtry=0;
整数=0;
答案;
做{
xtry=游戏();
numberofplays++;
TotalTrys=TotalTrys+xtry;
printf(“再次播放?(y表示是,n表示否):”;
答案=getchar();
如果(答案=='n')
玩=假;
}while(play==true);
平均=(浮动)(总尝试次数/播放次数);
printf(“平均值是每场比赛%f次尝试”,平均值);
返回0;
} 
智力游戏(无效){
整数=50;
int xnumber=25;
整数计数=0;
字符x;
布尔仍然猜测=真;
while(仍然猜测==true){
printf(“您的号码是%d吗?”,猜测号码);
x=getchar();
如果(x=='='='){
计数++;
printf(“很棒!\n”);
仍然猜测=错误;
返回计数;
}
else if(x==“”){
猜数=猜数+xnumber;
xnumber=xnumber/2;

if(xnumber函数
getchar
从流
stdin
中提取字符

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

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

您在
playgame
中的代码处理=,但它将Enter保留在
stdin
上……因此,您对
getchar
的下一次调用将提取该值

您需要做的是刷新
stdin
流。您不能使用它,因为
fflush
用于输出流

相反,您可以使用

void flushSTDIN() {
    while ((ch = getchar()) != '\n' && ch != EOF);
}
在提问之前,清除缓冲区中的所有旧换行符

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

因此:


函数
getchar
从流
stdin
中提取字符

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

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

您在
playgame
中的代码处理=,但它将Enter保留在
stdin
上……因此,您对
getchar
的下一次调用将提取该值

您需要做的是刷新
stdin
流。您不能使用它,因为
fflush
用于输出流

相反,您可以使用

void flushSTDIN() {
    while ((ch = getchar()) != '\n' && ch != EOF);
}
在提问之前,清除缓冲区中的所有旧换行符

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

因此:


您的问题是
getchar()
正在使用输入中的单个字符。但是,输入响应时,输入流始终至少包含两个字符:输入的字符(例如
'='
)和其后的换行符(或enter)

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

answer = getchar();
getchar()
的调用将获取您键入的上一个字符留下的换行符

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

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

我建议采取以下措施:

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

#include <ctype.h>
与:

同样,替换

x = getchar();
与:

一个分号是一个-something(在本例中为nothing)必须进入循环体

在一个条件下分配给
x
/
答案
通常是不受欢迎的,但在这种特殊情况下,这是最惯用的书写方式


请注意,
isspace()
的不正确宏实现可能会通过评估对
getchar()

的调用而导致问题您的问题是
getchar()
正在使用输入中的单个字符。但是,输入响应时,输入流始终至少包含两个字符:输入的字符(如
“=”
)和其后的换行符(或enter)

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

answer = getchar();
getchar()
的调用将获取您键入的上一个字符留下的换行符

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

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

我建议采取以下措施:

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

#include <ctype.h>
与:

同样,替换

x = getchar();
与:

那个