中易网

c语言gets函数

答案:7  悬赏:70  
解决时间 2021-01-10 00:51
c语言gets函数
最佳答案
gets函数的头文件:#include
gets()函数用于从缓冲区中读取字符串,其原型如下:
    char *gets(char *string);
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
【返回值】若成功则返回string的指针,否则返回NULL。
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。

全部回答
貌似是吧 请高人解答
15就可以了。因为STR(15)有16个字符:STR(0)~STR(15)。手机打不出中括号,见谅。
你的观点是正确的!
不过不知道你的代码中 get, put 是不是笔误。
另外不建议使用 gets, 不安全,容易发生这种溢出 , 推荐 fgets 函数
"I am a student"+'\0' =15个
我的一些看法:
gets()函数用来从标准输入设备读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。当输入I am a student!时刚好15个字符,然后gets()函数又自动在末尾加了'\0',此时就发生了溢出,多出来的字符将被写入到堆栈中,覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。此时会报出如下错误:
Run-Time Check Failure #2 Stack around the variable was corrupted.
是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用gets()已经发生了溢出!这是gets()不检查数据边界的bug造成的。
另外,“字符串不是总是以'\0'作为串的结束符”,答案是肯定的,不然puts()函数就不能在合适的地方停下来了。这里st[15]被gets()函数赋值为'\0'。这里要说明的是st[15],st[16]是存在而不合法的,因为字符串实际上就等同于指针,类似st[16]是实在的地址但是是不应该被引用的。
为什么这里溢出没有产生错误?可能系统分配内存是以一个最小的大小整段整段的分配(这个我只是猜测)。你可以试着输入的字符串变长一点,就可以看到内存读写出错的提示了,这就是溢出的严重后果!我在DOS系统下测试字符串长了直接当机。
验证1:st[15]被赋值为'\0'
#include"stdio.h"
main()
{
char st[15];
printf("input string :");
gets(st);
puts(st);
printf("%d",st[15]);
getch();
}
验证2:
#include"stdio.h"
main()
{
char st[15];
printf("input string :");
gets(st);
puts(st);
//printf("%d",st[16]);
st[1] = '\0';
printf("%s\n",st);
printf("%s",st+2);
getch();
}
同样的建议:拒绝gets(),这本来就是一个有bug的函数!
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
成都主导科技有限责任公司怎么样啊,接到面试
求文是心的小说《湛》《雪尔传》《闻川》
春雨桂花园地址在什么地方,我要处理点事
后背一放松就疼
心有明珠,山河明媚什么意思
2017年cma考试地点有哪些?
若爱请趁早,不爱也请趁早,谁都无权力耽搁谁
ASUSM5A78LMLX3主板配什么CPU显卡内存比较好
烧塔的由来100字
求有脱路人衣服 裤子 之类的 影片的网站。
岳飞同时代的·比岳飞年长一点的将领都有哪些
名爵mg6仪表trip是什么意思
联想wifi打印机m7206w怎么连接
转转我买完这个游戏号他咋给我
资源汽车站售票处地址有知道的么?有点事想过
推荐资讯
带有贺字的成语
义县去锦州的汽车
西宁唐述主题宾馆离西宁机场有多远
泰国随团旅游 中间离团是怎么规定的?
tf卡为什么能存储64g的东西,原理是什么,谢
蜻蜓一生能吃几只虫子?
广州那里有专业生产轻钢别野钢材的厂家?
求类似无敌打印机的抗战小说,不要加入G.C.D
匈奴与蒙古族??
停车场(钢铁北路)地址有知道的么?有点事想过
怎样才能最快消除钢印?
华硕n56 c面左上角的圆形按键干啥用的啊?怎
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?