一个猜数的小程序,不明白主函数中这样写为什么循环只能执行一次
#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;
}
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;
}