scanf_s()函数是Microsoft公司VS开发工具提供的一个功能与scanf()相同的安全标准输入函数。在调用该函数读取字符数组时,必须提供一个数字以表明最多读取多少位字符。
原因和区别:
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
char a[5]; scanf("%s", a); //如果输入123456789,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导程序运行异常。
以上代码如果用scanf_s()则可避免此问题:
char a[5]; scanf_s("%s",a,5); //最多读取4个字符,因为a[4]要放'\0' //如果输入超出容量了,数组将得不到任何东西。
注:scanf_s最后一个参数n是接收缓冲区的大小(即数组的容量)。
PS: 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。