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

时间:2013-02-06 00:14:59

标签: 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++;
        }
    }
}

2 个答案:

答案 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()功能中并不重要(尽管所有提示都打印了两次),但是当你到达

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()的错误宏实施可能会导致问题