• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

scanf和scanf_s的区别以及error C4996和warning C4477: “scanf”: 格式字符串“%d”需要类型“int *”的参数,但可变参数 1 拥有了类型“char *”

scanf_s是scanf的安全版本,当输入数组、字符和数组时需要第三个参数表示缓冲区的大小,表示最多读取n-1个字符。

在用VS2015进行C语言编程时,写输入函数不能写成scanf,而要写成scanf_s

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节。

如果输入1234567890,后面的部分会被写到别的空间上去。
以上代码如果用scanf_s,第二行应改为

表示最多读取4个字符,因为buf[4]要放’\0’。

综上所诉,当时用scanf_s输入数组、字符、字符串时必须添加第三个参数,用来表示缓冲区的大小,表示最多读取n-1个字符(整数、浮点数等不需要最后一位)。

读取单个字符也需要限定长度:

而不能写成

否则编译器会报错。

输入数组时:由于最后一位需要存放’\0’,所以需要的位置比数组大一个。

输入整数时:不需要第三位检测


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址