Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C/C++ gets、fgets、gets_s函数使用引起的思考

C/C++ gets、fgets、gets_s函数使用引起的思考

作者头像
用户7886150
修改于 2021-02-14 07:17:41
修改于 2021-02-14 07:17:41
9740
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: C++ gets()

2019独角兽企业重金招聘Python工程师标准>>>   

      最近做游戏编辑器,自己试着用C/C++写了一个读取简单配置表的函数,在控制台下测试的时候,使用了C的标准库gets函数,发现编译器报告gets函数unsafe,网上搜索了一下,发现gets函数不对接受字符串的buffer进行边界检测,会造成越界,从而产生bug;自己写的东西,也是自己用的东西,当然可以在定义配置表的时候得到控制,从而不会使越界的情况出现,但是总的来说这不是一个好的思考方式;于是按照网上的提示改用了fgets函数替代;  

      使用fgets函数后,就发现问题了,原来的代码不能正常工作了,调试了一通,发现使用fgets函数获取的字符串与gets函数获取的不一样,fgets函数获取的字符串会在buffer里面保留换行符,而gets函数不会;好吧,问题找到了,解决也很简单,把最后一个换行符拿掉,换成'\0'就可以了。然后,又发现有个gets_s函数,可以像gets一样不会获取换行符,也不会有gets的越界问题,然后在cppreference.com查看了这几个函数的描述,却发现gets_s函数是一个标准库扩展函数,一个可选项;所以就不知道这个gets_s函数在各个编译器下的支持情况如何!作罢,还是使用fgets函数吧。  

      这里所引起的思考是:很多的库函数都有着一些很细节的限制,而它的reference一般都会有详细的描述,这就得在使用库函数时去详细的了解库的条件和限制,以免因对库的片面理解,而造成bug.  

转载于:https://my.oschina.net/u/146011/blog/160875

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C Primer Plus(七)
本篇,我们主要讨论字符串的性质、如何声明并初始化字符串、如何在程序中输入和输出字符串,以及如何操控字符串。
1ess
2021/11/01
7630
C语言字符串I\O
分析常用的处理字符串输入和输出的函数,以及如何结合这几个函数进行优化和设计一些新的处理字符串输入输出的函数。
CtrlX
2022/11/14
5K0
字符数组输入输出---fputs,gets_s,puts,fputs
都是从标准输入设备中接收。 接收的字符串结束之后都会自动在字符串的末尾追加’\0’作为字符串结束符。
大忽悠爱学习
2021/03/02
7280
字符数组输入输出---fputs,gets_s,puts,fputs
C/CPP输入输出函数汇总分析
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
CtrlX
2023/03/21
2.1K0
fgets函数的用法
【原文出处: http://www.cnblogs.com/coder-jhm1314/articles/4561006.html】
用户7886150
2021/02/12
2.3K0
要点3:输入函数对比与自定义输入方式
运行程序,输入 两个整数,打印为 2,测试输入3个值仍然打印2,是因为这个"%d %d"指定了只解析两个int,多余的将留在缓冲区中,如果后面再写一个scanf,将从缓冲区中继续解析。
CN_Simo
2020/08/20
8730
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数
半截诗
2024/10/09
2210
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
gets 、getchar 、fgets 、scanf的用法
https://www.cnblogs.com/-lyric/p/5118666.html
嵌入式与Linux那些事
2021/05/20
3.7K0
linux系统编程之基础必备(四):C 标准库IO缓冲区和内核缓冲区的区别
本文介绍了Linux C编程的基本语法和编程规范,包括变量、数组、字符串、函数、指针等,以及标准I/O库和输入输出流,还介绍了Linux C编程中的异常处理、多线程编程、网络编程等内容。
s1mba
2018/01/03
2.6K0
linux系统编程之基础必备(四):C 标准库IO缓冲区和内核缓冲区的区别
【熟视C语言】如何快速的了解一个库函数(C语言讲解,以string.h中的部分库函数为例)
C语言的库函数虽然不算多,但若能熟练掌握一部分,或者说能学会去了解库函数的使用,无论是对C语言的使用熟练程度还是自己代码能力的提升都是有帮助的。所以,本篇文章旨在向读者展示如何了解并熟练使用一个库函数,本篇文章以头文件string.h中的一部分库函数为例讲解。
Crrrush
2023/06/23
4220
【熟视C语言】如何快速的了解一个库函数(C语言讲解,以string.h中的部分库函数为例)
C语言fputs()和fgets()函数
写文件:fputs()函数 fputs()函数将一行字符串写入文件,它将字符串输出到流。
C语言与CPP编程
2020/12/02
6450
快速了解C语言基础知识-学习笔记
你是否想要揭开计算机编程的神秘面纱?那么,不妨从C语言开始,它是计算机编程的基石,带你领略编程的魅力和乐趣。接下来希望我的文章能让大家对C语言拥有有一定的认识。
LonlyMay
2024/10/21
7270
快速了解C语言基础知识-学习笔记
解决带空格的字符串输入问题:C/C++中的几种常用函数
在C/C++编程中,读取带空格的字符串一直是一个常见的问题。传统的 scanf 和 gets 函数在处理带空格字符串时往往会遇到一些限制和问题。为了更加安全地处理带空格的字符串输入,我们可以选择不同的方法,本文将详细介绍几种常用的解决方案,并展示它们的优缺点。
平凡之路.
2025/02/05
6200
【C语言】常见概念
目前已知已经有上千种计算机语言,人们通过计算机语言写的程序,给计算机下达指令,让计算机工作。
云边有个稻草人
2024/10/21
3010
【C语言】常见概念
C++字符串输入函数小结
看了网上有人写的,不是很全,而且还有几处错误,所以自己重新找了一下MSDN中的相关内容。
用户7886150
2021/02/17
9280
【C语言】C语言标准库大梳理(超全)
C89 标准库总共划分为 15 个部分,每个部分用一个头文件描述,C99 标准新增了 9 个(为了简化学习,这里暂不提 C11 标准),总共有 24 个头文件。
苏州程序大白
2022/04/14
2.9K0
【C语言】C语言标准库大梳理(超全)
C++中cin的详细用法
cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
恋喵大鲤鱼
2018/08/03
8.3K0
C++中cin的详细用法
C/CPP输入输出函数汇总分析
scanf,printf,getc,putc,getchar,putchar,gets,puts,fgets,fputs,fgetc,fputc,fscanf,fprintf等.
CtrlX
2022/11/11
1.4K0
【C语言】了解函数,认识函数
函数(function)的概念,有些翻译为:子程序,子程序这种翻译更加准确⼀些。C语言中的函数就是一个完成某项特定的任务的一小段代码。C语⾔的程序其实是由⽆数个小的函数组合而成的,也可以说:一个大的计算任务可以分解成若干个较小的函数(对应较小的任务)完成。
用户11367452
2024/11/21
2620
【C语言】了解函数,认识函数
C/C++ (stdio.h)标准库详解
cstdio,在C语言中称为stdio.h。该库使用所谓的流与物理设备(如键盘、打印机、终端)或系统支持的任何其他类型的文件一起操作。
DevKevin
2024/03/19
1.3K0
C/C++ (stdio.h)标准库详解
相关推荐
C Primer Plus(七)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档