如何在C语言中安全地读取用户输入
如何在C语言中安全地读取用户输入
文章摘要:如何在C语言中安全地读取用户输入方面的知识,接下来就是全面介绍。

getline提供了一种更灵活的方法,可以在不破坏系统的情况下将用户数据读入程序。
在 C 语言中读取字符串是一件非常危险的事情。当读取用户输入时,程序员可能会尝试使用 C 标准库中的gets函数。它的用法非常简单:
char *gets(char *string);
gets从标准输入读取数据,然后将结果存储在一个字符串变量中。它会返回一个指向字符串的指针,如果没有读取到内容,返回NULL值。
举一个简单的例子,我们可能会问用户一个问题,然后将结果读入字符串中:
#include
输入一个相对较短的值就可以:
Where do you live?
Chicago
然而,gets函数非常简单,它会天真地读取数据,直到它认为用户完成为止。
但是它不会检查字符串是否足够容纳用户的输入。
输入一个非常长的值会导致gets存储的数据超出字符串变量长度,从而导致覆盖其他部分内存。
Where do you live?
Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch
最好的情况是,覆盖部分只会破坏程序。
最坏的情况是,这会引入一个严重的安全漏洞,恶意用户可以通过你的程序将任意数据插入计算机的内存中。
这就是为什么在程序中使用 gets函数是危险的。
使用gets,你无法控制程序尝试从用户读取多少数据,这通常会导致缓冲区溢出。
安全的方法
fgets函数历来是安全读取字符串的推荐方法。
此版本的gets提供了一个安全检查,通过仅读取作为函数参数传递的特定数量的字符:
char *fgets(char *string, int size, FILE *stream);
fgets函数会从文件指针读取数据,然后将数据存储到字符串变量中,但最多只能达到size指定的长度。我们可以更新示例程序来测试这一点,使用fgets而不是gets:
#include
如果编译运行,你可以在提示符后输入任意长的城市名称。
但是,程序只会读取 size= 10 数据存储到字符串变量中。
因为 C 语言在字符串末尾会添加一个空(\0)字符,这意味着fgets只会读取 9 个字符到字符串中。
Where do you live?
Minneapolis
虽然这肯定比fgets读取用户输入更安全,但代价是如果用户输入过长,它会“切断”用户输入。
相关阅读
-
简单的网站设计模板 一个完整的网页设计流程
本文导读:简单的网站设计模板和一个完整的网页设计流程的电脑小知识,一起来看看吧! 随着个人创业的流行,很多个人也需要一个比较详细的网站来展示自己,开展个人业务,或者积累粉
-
python工具有哪些 新手python编程入门自学知识
为大家分享python工具有哪些和新手python编程入门自学知识的介绍,如有不对的地方欢迎指正! 随着python的火热,不少的程序员业余时间都会研究这门编程语言。 利用python开发,大牛用vim,接了
-
开网站需要多少钱 公司网页制作流程及费用
一篇很详细的教程是关于开网站需要多少钱和公司网页制作流程及费用的相关经验,接下来IT袋带大家一起了解。 这个问题可以说是网站建设常见问题最热门的问题,也是客户咨询的最多的问
-
哔哩哔哩是网站吗 哔哩哔哩是个什么网站
小编为你解答哔哩哔哩是个什么网站的IT小经验,哔哩哔哩是中国年轻世代高度聚集的文化社区和视频网站,简称B站,B站早期是一个ACG(动画、漫画、游戏)内容创作与分享的视频网站。


