1、请问第十三行为什么条件是ret!=1,而不是ret=0?(因为scanf函数错误的时候返回值是0所以我认为应该是ret=0)
2、请问第十五行的gatchar()!='\n'为什么是清除缓冲区中的输入字符作用?(没太看懂这行表达的是什么意思)
3、请问随机数种子srand()和rand()是什么关系?srand()括号里的整数是表示什么?
谢谢大家!感激不尽!
1、第13行改为 ret==0 也是可以的,ret!=1 表示正确读取的数目不是1 ,也就是代表读取数据错误,ret==0代表正确读取到的数据项数为0,在这个程序里也可以代表scanf()读取数据错误,所以也是可以的;
2、第15行while(getchar()!='\n'); 是 当scanf()正确读取到的数据项不为1,则可以清除缓冲区的数据 ,让scanf()不会阻塞,此行放到while循环后面可以在正确读取到数据时时,缓冲区多余的数据的作用。
3、srand()是用于设置随机数种子,这个随机数种子会决定后面调用rand()函数产生的随机数,srand()函数里的整数表示随机数种子,rand()%100+1 为产生一个1~100之间的随机数。
测试代码如下:
参考链接:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(void){
int magic,guess,counter=0;
int ret;
// https://zhidao.baidu.com/question/1968010491949209140.html
// https://baike.baidu.com/item/srand/796881?fr=aladdin
// 使用当前系统时间来作为随机数的种子,可以让每次产生的随机数会出现更多变化,
//因为每次系统时间都是一个不同的数, 而这个种子数与后面产生的随机数有关联关系
srand(time(NULL));
// https://blog.csdn.net/zcr_59186/article/details/123644402
// https://www.zhihu.com/question/491046741
// rand()一个产生 0~RAND_MAX之间的伪随机数,rand()%100 把这个数对100求余后变成0~99之间的一个数
// 然后+1变为一个1~100之间的数,如此可以实现产生一个1~100的随机数
magic = rand()%100+1;
do{
printf("Please guess a magic number:");
// https://baike.baidu.com/item/scanf/10773316?fr=aladdin
ret = scanf("%d",&guess);
while(ret!=1){ //改为ret==0 也可以
// 当scanf()正确读取到的数据项不为1,则可以清除缓冲区的数据
// 此行再放到while循环后面更好
while(getchar()!='\n');
printf("Please guess a magic number:");
ret = scanf("%d",&guess);
}
while(getchar()!='\n'); // scanf()正确读取到数据后,可以清除缓冲区多余数据 ,加上这个可能更适合一点
counter++;
if(guess>magic){
printf("Wrong! Too big!\n");
}else if(guess < magic){
printf("Wrong! Too small!\n");
}else{
printf("Right!\n");
}
}while(guess!=magic&&counter<10);
printf("counter = %d\n",counter);
return 0;
}