努力自学的小菜张 2023-04-08 01:09 采纳率: 50%
浏览 23
已结题

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

img


1、请问第十三行为什么条件是ret!=1,而不是ret=0?(因为scanf函数错误的时候返回值是0所以我认为应该是ret=0)
2、请问第十五行的gatchar()!='\n'为什么是清除缓冲区中的输入字符作用?(没太看懂这行表达的是什么意思)
3、请问随机数种子srand()和rand()是什么关系?srand()括号里的整数是表示什么?
谢谢大家!感激不尽!

  • 写回答

2条回答 默认 最新

  • a5156520 2023-04-08 10:17
    关注

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

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 创建了问题 4月8日

悬赏问题

  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?