最近用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,即可。