c语言gets函数
答案:7 悬赏:70
解决时间 2021-01-10 00:51
- 提问者网友:浪荡绅士
- 2021-01-09 07:31
c语言gets函数
最佳答案
- 二级知识专家网友:夜风逐马
- 2021-01-09 08:07
gets函数的头文件:#include
gets()函数用于从缓冲区中读取字符串,其原型如下:
char *gets(char *string);
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
【返回值】若成功则返回string的指针,否则返回NULL。
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。
gets()函数用于从缓冲区中读取字符串,其原型如下:
char *gets(char *string);
gets()函数从流中读取字符串,直到出现换行符或读到文件尾为止,最后加上NULL作为字符串结束。所读取的字符串暂存在给定的参数string中。
【返回值】若成功则返回string的指针,否则返回NULL。
注意:由于gets()不检查字符串string的大小,必须遇到换行符或文件结尾才会结束输入,因此容易造成缓存溢出的安全性问题,导致程序崩溃,可以使用fgets()代替。
全部回答
- 1楼网友:西风乍起
- 2021-01-09 12:07
貌似是吧 请高人解答
- 2楼网友:神也偏爱
- 2021-01-09 11:56
15就可以了。因为STR(15)有16个字符:STR(0)~STR(15)。手机打不出中括号,见谅。
- 3楼网友:零点过十分
- 2021-01-09 11:33
你的观点是正确的!
不过不知道你的代码中 get, put 是不是笔误。
另外不建议使用 gets, 不安全,容易发生这种溢出 , 推荐 fgets 函数
不过不知道你的代码中 get, put 是不是笔误。
另外不建议使用 gets, 不安全,容易发生这种溢出 , 推荐 fgets 函数
- 4楼网友:话散在刀尖上
- 2021-01-09 10:59
"I am a student"+'\0' =15个
- 5楼网友:零点过十分
- 2021-01-09 10:54
我的一些看法:
gets()函数用来从标准输入设备读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。当输入I am a student!时刚好15个字符,然后gets()函数又自动在末尾加了'\0',此时就发生了溢出,多出来的字符将被写入到堆栈中,覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。此时会报出如下错误:
Run-Time Check Failure #2 Stack around the variable was corrupted.
gets()函数用来从标准输入设备读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。当输入I am a student!时刚好15个字符,然后gets()函数又自动在末尾加了'\0',此时就发生了溢出,多出来的字符将被写入到堆栈中,覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。此时会报出如下错误:
Run-Time Check Failure #2 Stack around the variable was corrupted.
- 6楼网友:duile
- 2021-01-09 09:18
是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用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的函数!
这样使用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的函数!
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯