问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言,gets函数的详细用法?

发布网友 发布时间:2022-04-25 20:43

我来回答

4个回答

热心网友 时间:2022-06-17 06:15

c语言,gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。其调用格式为:gets(s)。其中s为字符串变量(字符串数组名或字符串指针)。如果为单个字符指针,编译连接不会有错误,但运行后内存溢出错误。

扩展资料:

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

gets(s)函数可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。

热心网友 时间:2022-06-17 06:15

是的,如果这是某书上的做法,那么,我只能说它为你们提供了一个错误的榜样。
这样使用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的函数!

热心网友 时间:2022-06-17 06:16

gets从标准输入设备读字符串函数。可以无限读取,不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。


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


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


本函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入(即大多数情况下的键盘输入),具体参阅fgets词条)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区。


#include "stdio.h"    //这个头文件包含gets()函数
void main()
{
    char str1[5];
    gets(str1);
    printf("%s\n", str1);
}


gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'\0'字符。其调用格式为:

gets(s);

其中s为字符串变量(字符串数组名或字符串指针)。

gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。


gets(s) 函数中的变量s为一字符串指针。如果为单个字符指针,编译连接不会有错误,但运行后内存溢出错误。

宽字符版本,当使用unicode宽字符文本时,使用这个函数 _getws();

出自:

http://ke.baidu.com/link?url=MnxLdt2P1bTvlcPmloudfzw34NcQQnjrSqLbxRIhoOacmi8nb3yugNCjZe8V_0Qa3L9ltE43qRQf3s9Y_AdIYa

热心网友 时间:2022-06-17 06:16

参考:
http://wapke.baidu.com/view/1457521.htm?adapt=1&fr=aladdin&bd_source_light=1701851
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
高考为什么不能补报志愿? 帮我翻译一句话“不管多久以后,不管世界变成什么样子,我都是哪个最骄傲... 温州到周口的大巴车经过台州路桥客运中心那里吗? 微信怎么设置看不到微信号 不想让微信号显示出来怎么办 2021年大学教师资格证报名费用 大埔教师资格证报名网 大埔县教育局办教师资格证需要准备哪些资料? 深情触摸2016百度云链接 求深情触摸百度云分享 c语言gets()的用法是什么? gets(str) C语言字符串gets(str) 笔记本电脑比台式电脑的键盘多哪几个键哦? 笔记本电脑键盘和台式电脑键盘的区别? 笔记本和台式电脑的快捷键作用一样吗? 谁知道笔记本电脑和台式电脑键盘有多少个按键? 笔记本和台式电脑的快捷键 要常用的,,, 电脑共有多少个按键? 常见的键盘都是多少键的? 想到广州找工作可是又不知道哪里工厂比较多!, 广州哪里工厂比较多,找工作好难啊!求详细位置,正规点的,谢谢! 在广州去哪里找工作好? 求知广州哪里找工作比较好 在广州找工作,哪里最方便? 在广州哪里找工作比较好?谁有什么工作能够介绍一下 去广州打工的话,得个哪里找工作呢?(工资高) 请问!广州市,那里最好找工作? 真丝缎面发白怎么办 重磅真丝洗过后表面泛白是什么原因 gets(str); 什么意思,求解答 gets(str)小问题 下面C语言函数的作用:puts(str),gets(str),strcmp(str1,str2),strcpystr1,(str2) 定义字符串 char a[100] 输入时,gets(str)和scanf("%s",a)有区别吗 C语言gets函数的用法,能用代码举个例子么 请问,为什么要在 gets(str); 前面放 getchar(); 呢? gets(str) 就可以获取输入的字符串了啊。 感激.. c语言中,用gets()读数怎样判断读到一行空行 c语言中,输入一个字符串使用scanf(”%s”)和gets()有什么区别 关于C语言里的gets()问题,为什么名字输入被跳过? gets函数的功能 求教C语言大神! gets()输入一个字符串后,我想接着输入一个字符,这时需要额外加getchar来接受回车符吗 C语言里面gets(str)会自动添加'\0'吗? C语言关于gets的问题(输入出现了问题) 干部教育培训机构评估的内容包括哪些? c语言 这里gets_s读取字符,输入A,能输出a[0]为A,而输入AB时,a[0]没有任何输出,什么原因? gets处理换行符 组织干部进行培训的动力是什么 干部教育培训管理部门可以委托哪些机构承担干部教育培训任务? 干部教育培训机构违反规定的,如何处理? 杭州干部培训机构哪家干部去的多?