您的位置:首页 > 其它

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

2013-07-05 22:36 543 查看
          今天在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了呀。其他的可以以此类推。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: