免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2791 | 回复: 10
打印 上一主题 下一主题

一个gets函数的有趣问题,求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-05 17:10 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char letters[5] = {'\0'};
&nbsp;&nbsp;&nbsp;&nbsp;printf("Please input a five digits number\n");
&nbsp;&nbsp;&nbsp;&nbsp;//while(1) {

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gets(letters);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf( "output: %s\n", letters );
&nbsp;&nbsp;&nbsp;&nbsp;//}

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


以上代码, 当用户输入的字符超过5个的时候,就会引起缓冲滥出,程序很大的机率出现段错误,
但是,如果把 while(1) 前面的注释去掉,也就是说,把对gets的调用放在循环里,程序运行起来好像“好好的”,没有出现段错误,这是什么原因呢?

我测试的平台是 fedora core8
gcc 4.1.2

论坛徽章:
0
2 [报告]
发表于 2009-01-05 17:17 |只看该作者
你换成gcc 4.1.1,或者换到core7上就出错了
错误的程序不一定导致错误的结果,如果你非要钻这个牛角尖,自己分析汇编码去吧

论坛徽章:
0
3 [报告]
发表于 2009-01-05 17:48 |只看该作者
本来程序就有问题,LS都已经说了,还是修改程序把

论坛徽章:
0
4 [报告]
发表于 2009-01-06 13:50 |只看该作者
我知道程序有问题啊, 我只是想知道为什么放在循环里, 错误就被隐藏了

论坛徽章:
0
5 [报告]
发表于 2009-01-06 18:05 |只看该作者
楼上要真想弄明白为什么,先弄明白栈、函数调用的实现、虚拟内存、分页管理这些概念吧。

论坛徽章:
0
6 [报告]
发表于 2009-01-06 18:10 |只看该作者
借用五毛党的一句话
错误的程序不一定得到错误的结果

论坛徽章:
0
7 [报告]
发表于 2009-01-06 18:25 |只看该作者
这话好像不是五毛党先说的吧。

论坛徽章:
0
8 [报告]
发表于 2009-01-06 18:34 |只看该作者
嗯,我今天生了不轻不重一般般程度的病,但还是出席了会议,会议报告非常精彩。可是如果我不说我患病的情况,谁会知道?还不是等病情发展到很严重了才看得出来。

论坛徽章:
0
9 [报告]
发表于 2009-01-06 18:52 |只看该作者

回复 #1 tangzs 的帖子

LZ,您都说了:“很大几率出错”。
这个是啥意思?

计算机最大的特点就是给确定的输入后就会给出确定的输出,你要是来个按几率出牌,小心冯.诺伊曼找你麻烦。

中医里有句头痛医脚,我觉得放计算机调试这边挺形象的。

论坛徽章:
0
10 [报告]
发表于 2009-01-06 20:47 |只看该作者
现在都不提倡用gets,很不安全,编译的时候连编译器都会给你警告,干嘛还要用
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP