猜数小程序遇到的问题

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

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

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

#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

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

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

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,所以就可以正常输入了。

修改如下,供参考:

#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;
}