关于ret和getchar()及随机数种子stand()与rand()

img


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之间的随机数。

测试代码如下:

参考链接:


https://zhidao.baidu.com/question/1968010491949209140.html

https://baike.baidu.com/item/srand/796881?fr=aladdin

https://blog.csdn.net/zcr_59186/article/details/123644402

https://www.zhihu.com/question/491046741

https://baike.baidu.com/item/scanf/10773316?fr=aladdin



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

img

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^