C语言里的 gets(),scanf() 都不检查缓冲区是否会溢出。至于此“漏洞”有什么样的风险,我没有体会。自己写的程序,自己用,没有风险。
成都创新互联公司是一家集网站建设,中山企业网站建设,中山品牌网站建设,网站定制,中山网站建设报价,网络营销,网络优化,中山网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
如果别人写的程序,含恶意代码,你也无可奈何,你不能叫别人用scanf()不用 gets()。
再说,
gets() 读取一行字符串,包括空白(空格,tab...)。
scanf("%s",....) 它没有 读取一行 的功能,遇到 空白 就不读下去了(它以空白为分隔符).
所以 scanf() 并不能代替 gets() 。
因为你在使用gets之前还使用过别的读入函数(或宏),有的是不会把末尾的换行读取掉的,就会留在缓冲区,当你调用gets时,把上一次的换行字符给读取了,所以就像直接跳过了。
改善的方法是为gets函数上一句加上getchar();用于吸收回车。或是加fflush(stdin);刷新缓冲区。
这是对程序产生BUG,出现不可靠性的一个描述,有些函数在某些意外情况会导致程序陷入不可控状态,仅仅是PC上运行最多也就是退出而已,但是如果是运行在飞机等系统里的话,就会有大麻烦,说危险也不为过。因为英文文献里描述为dangerous,所以也就翻译为危险。
函数执行需要一个栈空间,但这个栈空间容量是有限的,而且栈里存放了函数返回的地址。
gets()函数在获取输入时,如果无限输入会造成栈空间溢出,在程序返回时,不能正常的找到返回地址,程序将发生不可预测行为
gets(str)有边界溢出的可能。
比如你的str定义只有80个char单元,但输入的时候却输入了80个以上的字符,那么就发生了溢出。c语言是不检查边界溢出的,编译不报错。但溢出会破坏内存中的数据,产生不可预料的后果。所以要尽量避免。
但平常练习的时候gets()函数是经常用到的,因为它用起来很方便。
我们现在所编写的程序主要是为了学习算法,并不是像专业程序员那样要求严密性,减少BUG。所以你在给字符串定义了一个足够大的长度时用gets()没关系。
话有说回来,保持一个严谨的编程风格也是很有必要的。你自己抉择吧。
text是一个二维数组,gets(text[t])是给text[t]赋值。
这是关系到信息安全领域的一些知识。
会有这样的一个情况:
char a[12];
gets(a);
当你输入的东西远比12要长时,他还是会接收并写入空间。这样就溢出了,覆盖掉后面的相应空间。也就是说他写入了不该他来写的东西。如果写得设计好点,完全可以通过这个去完成一些不好的事情。编译器一般会提示你去换个安全的函数,来避免这个情况。
由于scanf函数遇到空格后就停止输入,如需要输入一句话的话,要尝试其他的函数例如gets()函数。
原型函数为char*gets(char*buffer),返回一个指向char的指针,返回的指针与传递给他的指针是同一个指针。
例子:
charname[20];
gets(name);
printf(“%s”,name);
此时在控制界面中输入helloworld,输出将会是helloworld。
上例同时也可以写成:
charname[20];
char*ptr;
ptr=gets(name);
printf(“%s”,name);
printf(“%s”,ptr);
此时两句话输出的都是helloworld,从而证明ptr的指针就是赋给gets函数的指针。但是gets()函数有一个缺点,当输入的字符串的长度大于申请的空间时,会造成空间越界,此时在函数执行结束释放空间时会报错。
扩展资料
1、输出字符串的效果,宽度和精度同样也适用于字符串。
3、put是需要遇到’\0’才会输出的,因此通过字符串数组遍历赋值时,不要忘记加’\0’。