米老虎383 2022-07-17 16:00 采纳率: 90%
浏览 19
已结题

猜数小程序遇到的问题

问题遇到的现象和发生背景

一个猜数的小程序,不明白主函数中这样写为什么循环只能执行一次

问题相关代码,请勿粘贴截图

#include<stdio.h>
#include<time.h>

#define N 100

int random_number(void);
int guess_interface(void);

int main() {
char i;
printf("A new number has been choose\n");
do {
guess_interface();
printf("Play again?\n");
scanf("%c", &i);

} while (i == 'Y');
return 0;

}

int guess_interface(void) {
int num, guess, fre=1;
num = random_number();
printf("Enter guess:");
scanf_s("%d", &guess);
while (guess != num) {
if (guess < num) {
printf("Too low; Try again");
fre++;
}
else if (guess > num) {
printf("Too high; Try again");
fre++;
}
scanf_s("%d", &guess);
}
printf("You win in %d guess\n", fre);
return 0;

}
int random_number(void) {
srand((unsigned)time(NULL));
return rand()%N+1;
}

运行结果及报错内容

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

3条回答 默认 最新

  • piaoyiren 2022-07-17 16:07
    关注

    do while(i==‘Y)d的意思是当输入 i=Y时继续循环,其他字符结束循环

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • it_hao528 2022-07-17 22:56
    关注

    1、do{}while(); 循环执行顺序是先执行do代码块的内容,执行完之后再进行while的条件判断,如果条件成立则继续进入do执行,条件不成立则退出循环。
    2、scanf_s();在接收了数字类型的数据之后因为要按回车键,输入会产生一个缓存'\n'。之后再接收字符串类型时就会读取到输入缓存里的'\n',就会直接读取一个空字符给要赋值的变量,所以你在main函数中的scanf("%c", &i);会直接读取空字符给i,i会得到一个空字符。循环条件 i == 'Y' 不成立,就退出循环了。
    3、scanf(" %c", &i);中在%c前加一个空格就会把前边的的缓存'\n'给读取掉,再输入的值会赋值给i,所以就可以正常输入了。

    评论
  • qzjhjxj 2022-07-18 09:07
    关注

    修改如下,供参考:

    #include <stdio.h>
    #include <stdlib.h> //缺头文件
    #include <time.h>
    #define N 100
    int random_number(void);
    int guess_interface(void);
    int main() {
        char i;
        srand((unsigned)time(NULL));  //srand()函数放在主函数里即可
        printf("A new number has been choose\n");
        do {
            guess_interface();
            printf("Play again?\n");
            scanf(" %c", &i);  //循环输入字符时,把残留在缓冲区多余的内容先吸收
        } while (i == 'Y' || i == 'y');//不区分 y 大小写
        return 0;
    }
    int guess_interface(void) {
        int num, guess, fre = 1, ret;
        num = rand() % N + 1;   //random_number();这函数可以不用
         do{
            do {                    //修改 
                printf("Enter guess:");
                ret = scanf_s("%d", &guess);
                getchar();  //吸收多余字符
            } while (ret != 1);   //修改 
            if (guess < num) {
                printf("Too low; Try again");
                fre++;
            }
            else if (guess > num) {
                printf("Too high; Try again");
                fre++;
            }
                  //scanf_s("%d", &guess);修改
         } while (guess != num);
        printf("You win in %d guess\n", fre);
        return 0;
    }
    int random_number(void) {
        srand((unsigned)time(NULL));
        return rand() % N + 1;
    }
    
    
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 7月26日
  • 已采纳回答 7月18日
  • 创建了问题 7月17日

悬赏问题

  • ¥15 java为什么这个按钮监听事件不触发
  • ¥20 unity打光没有照亮物体
  • ¥25 powershell如何拷贝1周前的文件
  • ¥15 询问MYSQL查询SQLSERVER数据表并比较差异后,更新MYSQL的数据表
  • ¥15 关于#前端#的问题,请各位专家解答!
  • ¥15 最小生成树问题 Prim算法和Kruskal算法
  • ¥25 医院住院病人呼叫器设计
  • ¥15 不想和现在的团队合作了,怎么避免他们对程序动手脚
  • ¥20 C语言字符串不区分大小写字典排序相关问题
  • ¥15 关于#python#的问题:我希望通过逆向技术爬取1688搜索页下滑加载的数据