论“scanf与scanf_s”

最近用vs2012写一个学生成绩管理系统时遇到了一点问题,在增删查改学生信息时,不可避免会用到scanf输入函数以及fopen文件操作函数,但程序完成后编译过程中,出现了一个报错如下:

1>------ 已启动生成: 项目: 20130925, 配置: Debug Win32 ------
1>  stdafx.cpp
1>d:\code\20130925\20130925\stdafx.cpp(18): error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          d:\vs2012\vc\include\stdio.h(218) : 参见“fopen”的声明
1>  20130925.cpp
1>  正在生成代码...

========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

编译器告诉我们,fopen和scanf或许是不安全的,建议后面加“_s”替换。

二者区别:scanf是C语言的一个标准输入函数,而scanf_s则是微软在vs2005版本后添加的一个与scanf功能相同但必须提供一个数字表示最多读取多少位的字符。因为传统的scanf函数在输入数据时并不检查边界,这样很容易导致内存访问越界,例如:

char buf[5]={'\0'};

scanf("%s",buf);

给buf定义了5字节的访问空间,但如果我给buf输入10字节的数,当前五个字节读取完毕后剩下的内容会被写到别的变量所在空间上,从而可能导致程序异常;

修改:

char buf[5]={'\0'};

scanf("%s",buf,5);

最后一个参数n是表示接收缓冲区的大小,表示最多读取n-1个字符,在这个例子中buf[4]会存放'\0'字符,最多可以读取n-1个字符。

这些_s的函数值存在的意义是为了安全,传入一个参数大小相关的值,避免引用到不存在的元素,防止原版的不安全性被利用。

解决方法:

如果你不想在vs2005以及以后的版本中写代码时用这些加了_s的函数,打开IDE,点击项目 =》属性 =》c/c++  =》预处理器=》点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS,即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值