zoukankan      html  css  js  c++  java
  • 【C】你还在用gets()吗?

      学过C的都知道gets()函数是用来接收字符串的一个函数,以前用的时候感觉挺好使的,但是今天碰到了一个问题。

      本人写的程序如下:

    1 #include <stdio.h>
    2 int main(void)
    3 {
    4     char name[10];
    5     gets(name);
    6     puts(name);
    7 }

      这个程序最简单不过了,就是一个字符串输出输入的问题,但是使用linux下的gcc编译老是不能通过,提示的问题是:

      “the 'gets' function is dangerous and shout not be used.

      让我很纠结,为什么这个函数不让使用,它怎么就危险了?

      然后我又查阅了linux C函数库之后就明白了。书上为这个函数附加了一条说明:“由于gets()无法知道字符串的大小,必须遇到换行字符或文件尾才会结束输入,因此容易造成缓存溢出的安全性问题。建议使用fgets()取代。

      原来gcc为了安全考虑就直接把gets()函数的使用权给取消了。下面是net小伙用windows下的vc编译的一个小程序,来说明gets()究竟有什么危害。

      程序如下:

     1 #include <stdio.h>
     2 int main(void)
     3 {
     4     char a;
     5     char name[3];
     6     char b;
     7     scanf("%c",&a);
     8     printf("a:%c\n",a);            //第一次输出a的值
     9     getchar();
    10     gets(name);
    11     scanf("%c",&b);                
    12     printf("name:%s;\na:%c;\nb:%c;\n",name,a,b);    //输出所有的值,注意a
    13 }

    我们来测试一下这个程序,运行结果如下:

    输入的字符串是abc,正好达到了预期的效果。我们增加字符串的长度,然后再测试一下看看有什么效果:

    由于我们把字符串改成了“this is a text”

    然后a的值莫名其妙的被替换了。紧接着编译器不能正常工作了。

    在不正确使用gets()函数的时候造成的危害是很大的,就像我们刚才看到的那样,a的值被字符串name溢出的值给替换了。我想这并不是你想要的结果吧!出于安全,用fgets()来代替gets()吧!

     

  • 相关阅读:
    gulp模块编译
    微擎数据库表-T
    微信小程序自动识别姓名电话地址
    PHPBase64格式编码图片
    HTML中Data的数据类型
    EPP状态码
    WePay-T
    HTML-T
    PHPNamespace命名空间
    jQuery:jQuery简介
  • 原文地址:https://www.cnblogs.com/ngnetboy/p/2789410.html
Copyright © 2011-2022 走看看