大家今天来跟大家唠唠我最近捣鼓的这个scanf_s
函数。之前一直用scanf
用得挺顺溜的,也没觉得有啥毛病。结果,最近写个小玩意儿的时候,编译器老是跳出来警告,说scanf
不安全,让咱换成scanf_s
。我就花时间好好研究一下,顺便把过程记录下来,跟大家分享分享。
初识scanf_s
我对这玩意儿是拒绝的。心想,这scanf
我用这么久,也没见出啥问题,干嘛非得换?结果,上网一查,好家伙,原来scanf
还真有点“安全隐患”。
简单来说,就是如果咱们用scanf
读取字符串的时候,要是用户输入的内容比咱们预留的空间还要大,就可能发生“缓冲区溢出”。这可不是闹着玩的,轻则程序崩溃,重则被人利用,搞出点安全漏洞来。为安全起见,还是得用scanf_s
。
上手实践
解原因,接下来就是动手实践。我先是找个简单的例子,试着把scanf
换成scanf_s
。
#include <stdio.h>

int main() {
char name[10];
printf("请输入你的名字:");
scanf_s("%s", name, 10); // 注意这里,多个参数10
printf("你%s!\n", name);
return 0;

大家看到没,scanf_s
比scanf
多一个参数。这个参数是干啥的?就是告诉scanf_s
,咱们给变量预留的空间有多大。像上面这个例子,我给name
预留10个字符的空间,所以就传个10进去。这样,就算用户输入的内容超过10个字符,scanf_s
也不会让它“溢出来”,保证程序的安全。
- 注意事项:在使用
scanf_s
读取字符串的时候,一定要记得加上这个表示缓冲区大小的参数! - 注意事项:使用读取其他类型数据(整数、浮点数)时,不需要加表示大小的参数。
深入探索
光会用还不行,咱还得搞清楚这背后的原理。我又查查资料,发现scanf_s
是微软自家提供的函数,并不是C语言标准库里的东西。如果咱们的代码需要在其他编译器上运行,可能还得做一些额外的处理。
不过对于我目前的需求来说,scanf_s
已经足够用。毕竟我只是想写个小玩意儿,又不是要开发啥大型软件。而且用scanf_s
确实能让我的代码更安全,何乐而不为?
总结
这回折腾scanf_s
的经历,让我对C语言的输入函数有更深的解。也让我明白,写代码不仅要追求功能,还得考虑安全。毕竟安全无小事,咱们还是得小心驶得万年船!
今天的分享就到这里。希望我的经验能对大家有所帮助。如果大家有啥问题或者想法,欢迎在评论区留言,咱们一起交流交流!