﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-lzmagic-随笔分类-C</title><link>http://www.cppblog.com/lzmagic/category/8567.html</link><description>1/4桶水荡漾</description><language>zh-cn</language><lastBuildDate>Mon, 03 Nov 2008 19:23:32 GMT</lastBuildDate><pubDate>Mon, 03 Nov 2008 19:23:32 GMT</pubDate><ttl>60</ttl><item><title>gets()函数和fgets()函数的差别</title><link>http://www.cppblog.com/lzmagic/archive/2008/11/03/65845.html</link><dc:creator>lzmagic</dc:creator><author>lzmagic</author><pubDate>Mon, 03 Nov 2008 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/lzmagic/archive/2008/11/03/65845.html</guid><wfw:comment>http://www.cppblog.com/lzmagic/comments/65845.html</wfw:comment><comments>http://www.cppblog.com/lzmagic/archive/2008/11/03/65845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/lzmagic/comments/commentRss/65845.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/lzmagic/services/trackbacks/65845.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c语言早期的时候当从标准输入读入一个字符串的时候使用的是gets()函数，但是后来发现gets()函数存在bug才出现了fgets()函数的定义。现在为了和老的程序兼容，c的编译程序当中仍旧保持对于gets()函数的支持。本篇就是说明gets()函数的bug所在。举个例子来具体说明：<br>有一段代码：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char line[124];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets(line);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里line是一个能容纳124个字符的数组，它是堆栈上自动分配的，如果gets()读入的字符串长于124个字符， 那gets()函数会继续把读入多出的内容压倒堆栈当中。这样就出现了溢出的问题，其实早期的蠕虫病毒就有的是利用这个bug而实现的。在c的官方网站上强烈建议使用fgets()函数。应该把上面的代码替换成：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char line[124];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fgets(line,sizeof(line),stdin)==NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样就不会出现溢出的问题了，因为fgets()函数对于读入字符的长度进行了限制。<br>&nbsp;<br>
<img src ="http://www.cppblog.com/lzmagic/aggbug/65845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/lzmagic/" target="_blank">lzmagic</a> 2008-11-03 15:36 <a href="http://www.cppblog.com/lzmagic/archive/2008/11/03/65845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>