scanf和scanfs的区别
2015-12-02 13:21
211 查看
scanf()函数是标准C中提供的标准输入函数,用以用户输入数据
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。
原因和区别:
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
以上代码如果用scanf_s()则可避免此问题:
注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.
PS: 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。
原因和区别:
scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:
//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节 char buf[5]={'\0'}; scanf("%s", buf); //如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。
以上代码如果用scanf_s()则可避免此问题:
char buf[5]={'\0'}; scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放'\0' //如果输入1234567890,则buf只会接受前4个字符
注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符.
PS: 很多带“_s”后缀的函数是为了让原版函数更安全,传入一个和参数有关的大小值,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系统。
相关文章推荐
- 如何创建和部署网站
- iOS开发多线程篇—GCD的基本使用
- checkbox 全选
- VMware下桥接设置
- ZZULIOJ 1675 E:YJJ的福利
- ECSHOP在PHP5.5及高版本上报错的解决方法
- MyEclipse2015各种好用的自定义配置(SVN, JDK, Maven, Tomcat, 自动补全, UTF-8, 字体等)
- Nginx的学习
- socket阻塞与非阻塞,同步于异步
- Linux任务调度命令crontab
- 斐波那契数列(fabnacci)java实现
- ITIBB原创,互联网首部自媒体小说《1024伐木累》-小白篇之入职-总章节一
- 图文详解MyEclipse中新建Maven webapp项目的步骤
- php常用正则表达式
- ubuntu下vsftpd配置
- android popwindow 位置和动画
- 虚拟机怎么安装vmware tools
- Scala实战:并发-Future和Promise
- ZZULIOJ 1224 画表格
- Pi Zero+ESP8266的组合还要等多久?