所以这是我写的一些代码,我是大麦开头的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++;
}
}
}
答案 0 :(得分:2)
函数getchar
从流stdin
中提取一个字符。
流stdin
包含您输入标准输入设备的所有内容;在你的情况下,这是键盘。
现在,当您回应计算机的猜测时,按两个键。按 = 然后按输入。
playgame
中的代码处理 = ,但它会在stdin
上留下 Enter ...因此,您下次调用{ {1}}拉扯。
您需要做的是刷新getchar
流。您不能使用fflush(stdin)
,因为stdin
用于输出流。
相反,您可以使用类似
的内容fflush
在提出问题之前清除缓冲区中的所有旧换行符。
您应该在程序中调用void flushSTDIN() {
while ((ch = getchar()) != '\n' && ch != EOF);
}
之前执行此操作。
所以:
getchar
答案 1 :(得分:1)
您的问题是getchar()
从输入中消耗了一个字符。但是,当您输入响应时,输入流始终包含至少两个字符:您输入的字符(例如'='
)和后面的换行符(或输入字符)。
这在playgame()
功能中并不重要(尽管所有提示都打印了两次),但是当你到达 p>时
answer = getchar();
对getchar()
的此次调用会获取您键入的上一个字符所留下的换行符。
如何解决这个问题是一个关于如何处理用户输入的问题 - 是否要验证它,是否希望能够输入更长的字符串等等。
在您的情况下,最简单的解决方案是将您对getchar()
的调用替换为将丢弃空格的循环。
我建议做以下事情:
在程序开头(或附近)添加以下行:
#include <ctype.h>
这提供了isspace()
函数,可以干净利落地检查字符是否为空格。
替换行:
answer = getchar();
使用:
while (isspace(answer = getchar()))
;
同样,替换
x = getchar();
使用:
while (isspace(x = getchar()))
;
单个分号是null statement - 某些东西(在这种情况下没有)必须进入循环体。
在某种情况下分配给x
/ answer
通常会不受欢迎,但在这种特殊情况下,这是写这篇文章的最惯用方式。
请注意,通过评估对isspace()
multiple times
getchar()
的错误宏实施可能会导致问题