C 为什么我的代码会跳过用户的输入?
这是我写的一些代码,我是从c开始的,所以请容忍我,我的代码对我来说是有意义的,但它不能正常工作,当我试图说“不”停止播放并显示平均值时,它会重复播放功能 基本上,我的程序从1-100猜测用户数,不管用户想出什么数字。这里有一些输出是错误的,只是给你一个想法。游戏功能运行良好,但不是主要功能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
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();
与:
那个