C: scanf与scanf_s的区别
用了scanf在VS2010,编译提示说,建议用scanf_s。
#include<stdio.h>
printf("Enter String:");
scanf("%s",string_input);
原因和区别:
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
|
1
2
3
4
|
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节char buf[5]={'\0'};scanf("%s", buf);//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。 |
以上代码如果用scanf_s()则可避免此问题:
|
1
2
3
|
char buf[5]={'\0'};scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0' //如果输入1234567890,则buf只会接受前4个字符 |
查了下,
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。另外,很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。简单的理解,就是scanf_s会比scanf更安全,那么为了安全也需要编程者多传一些参数,这些参数就是变量的长度(占用的字节数)。(摘自ID“自信男孩"的解答)
很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,有时黑客可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的,有这个参数20使准确性提高。(百度百科)
————————————————
版权声明:本文为CSDN博主「墨梅C」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43309823/article/details/95386759
本文版权归作者所有,谢绝转载,违者必究!
浙公网安备 33010602011771号