关于gets函数和fgets函数的一些理解

          今天在linux编程,用到gets函数,从键盘输入字符。但是由于gets函数没有限制域,当你输入的字符超出限制时,就会覆盖原有的字符。在编译的时候,会警告

 “warning:the gets function is dangerous and should not be used", 事实上,gets函数也仅仅应用在玩具程序上面。

   

         而fgets函数则能够消除这个缺点,fgets 函数作为键盘输入的时候,他的使用格式如下

         fgets(str,n,stdin) ;其中str可以是数组名,n是输入的字符的输入限制值,stdin是标准输入指针。这里就是指键盘。

与gets相比使用这个好处是:可以读取指定大小的数据,避免gets函数从stdin接收字符串而不检查它所复制的缓存的容积导致的缓存溢出问题。
        
           #include<stdio.h>
          #include<string.h>
          main()
          {
             int length;
             char str[80];
            fgets(str,6,stdin);
        /**/    str[strlen(str)-1]='\0';
            length=strlen(str);
            printf("the value is:%s",str);
            printf("the length is:%d",length);
 
           }
       
             我们先把/**/句屏蔽掉,运行的时候。
 
 
 行数             输入                                 输出1 (第一个printf)                 输出2(第二个printf)
      1               a                                            a                                                               2
      2               abc                                       abc                                                            4
      3              abcd                                      abcd                                                         5
      4              abcde                                    abcde                                                       5
      5              abcdef                                   abcde                                                       5
 
    由此我们知道,      在前三行的时候,结束输入的时候,系统会追加一个\n,并且在字符长度上会计入,
    但是在第四行的时候,此时数组的值应是“abcde\n",但是这时数组长度还是5,
    所以当输入的字符<=n-2时,才会把\n当成一个字符计入。
               
 
    但是fgets函数在百科的介绍上说一定要加上上文所屏蔽的那句话的啊,str[strlen(str)-1]='\0';  因为字符串是以\0结尾的啊。
      

     加上那句话,运行结果又怎样呢??   look down!!!!

    行数             输入                                 输出1 (第一个printf)                 输出2(第二个printf)

      1               a                                            a                                                                1
      2               abc                                        abc                                                            3
      3               abcd                                     abcd                                                          4
     4                abcde                                   abcd                                                          4
     5                abcdef                                  abcd                                                          4
 
下面解释原因:
 
                                              当输入a时,strlen(str)=2; str[0]=a, str[1]=\n.   然后执行屏蔽句,即str[1]=\0,此时再计算数组的长度,肯定是1了呀。其他的可以以此类推。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值