c语言gets函数

#include"stdio.h"main(){charst[15];printf("inputstring:\n");get(st);put(st);}输入:Iamas... #include"stdio.h"
main()
{char st[15];
printf("input string :\n");
get(st);
put(st);}
输入:I am a student.这里正好是15个,请问字符串不是总是以'\0'作为串的结束符,那么这里st[15]应该改成st[16]才是正确的,请问是不是书上写错了
展开
 我来答
学法律的小邵
高粉答主

推荐于2019-10-23 · 关注我不会让你失望
知道小有建树答主
回答量:793
采纳率:100%
帮助的人:23.4万
展开全部

gets()函数用于从缓冲区中读取字符串,其原型如下:

char *gets(char *string);

gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。

【返回值】若成功则返回string的指针,否则返回NULL。

注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。

扩展资料:

功能

从stdio流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

返回值

读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。

注意

本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。

这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。

参考资料:百度百科-gets

沈醉柳石艾
2020-01-31 · TA获得超过3万个赞
知道小有建树答主
回答量:1.1万
采纳率:30%
帮助的人:929万
展开全部
可以到是可以,但那样很麻烦的。gets()一般是用来接受一个已经存在的字符串。其实你可以用getchar(),利用迭代实现把输入读入到一个二维数组中去。
int
i,j;
char
str[100][100];
//这个数组的大小要根据你要输入的字符多少来定
s=getchar();
for(i=0;i<100
&&
s!=EOF;i++)
for(j=0;j<100
&&
s!=EOF;j++)
{
str[i][j]=s;
s=getchar();
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
广琦浮雅琴
2019-07-24 · TA获得超过3845个赞
知道大有可为答主
回答量:3119
采纳率:31%
帮助的人:157万
展开全部
关系很大,因为gets
实际
并不知道
字符数组
s的
长度
,它会错误的以为s足够长,于是它会把'\0'放到s[14]后面那个
存储单元
中,而那里已经不属于s了,如果运气好,后面的
内存
没有人
用,一切正常,否则你就修改了本不该改的内容,从而造成不可预知的
错误
甚至
应用程序
崩溃。试一下下面的
代码
就知道了
int
main()
{
char
s2[4]
=
"123";
char
s[4];
printf("%x,
%x",
s2,
s);
gets(s);
puts(s2);
getchar();
}
输出abcdefghijklmn,你会发现,gets(s)连s2中的内容也修改了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友98c8a11
推荐于2017-09-15 · TA获得超过1172个赞
知道小有建树答主
回答量:261
采纳率:0%
帮助的人:446万
展开全部
是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用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的函数!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2e16d69
2012-08-04
知道答主
回答量:78
采纳率:0%
帮助的人:27.9万
展开全部
我的一些看法:
gets()函数用来从标准输入设备读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。当输入I am a student!时刚好15个字符,然后gets()函数又自动在末尾加了'\0',此时就发生了溢出,多出来的字符将被写入到堆栈中,覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。此时会报出如下错误:
Run-Time Check Failure #2 Stack around the variable was corrupted.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(9)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式