使用scanf_s报错:0xC0000005: Access violation writing location 0x00000000
在vs2010中写了一行scanf(“%s",name); 调式时 提示warning , 提示修改为scanf()使用可能会存在不安全,建议使用scanf_s() 但是我修改成scanf_s("%s",name)之后,正常运行没有问题,也没有了warning ,但是遇到scanf_s("%s",name)这句话时,我输入了一个name, Enter 一下就报如下错误:
0xC0000005: Access violation writing location 0x00000000
在MS系统中错误代号:0xC0000005 表示访问不存在的内存
原来,ANSI C中没有scanf_s() , 只有scanf(), scanf()在读取数据时不检查边界,所以可能会造成内在泄露。所以MS在vs2005及更高级版本中提供了scanf_s(),但是在调用它时,必须提供一个数字表明最多读取多少位字符。
[官方文档:http://msdn.microsoft.com/zh-cn/library/w40768et%28VS.80%29.aspx ]
之所以出现:0xC0000005这样的错,是因为在调用的时候没有为它申请到内存,所以报访问内存不存在,因为我输入了字符串,这些字符串在buffer是有一个地址代表它们存在的位置的,但是调用scanf_s()时因为没有指定读取多少位字符, 所以它无法去读取内存buffer中的字符串,所以报内存不可读取的错误。 如果我们改成如下形式,给scanf_s()指定读取例如10个字符,即可顺利完成读取任务:
scanf_s("%s",name,10);
因为scanf() 在读取数据时不检查边界,由此可能造成安全隐患, 所以MS在vs2005版本及更高级版本中就建议使用scanf_s()来代替scanf()函数, 但是如果你坚持要使用scanf()函数的话,一般也不会出现什么问题, 不过vs在编译时会给出warning提示, 如果要消除这个提示, 只要在使用了scanf()的文件最开始的地方加入如下语句即可:
#pragma warning(disable:4996)
scanf_s函数也是从标准输入流中读取数据并把它们格式化写入到指定的变量中, 不像scanf()函数, scanf_s()函数在读取输入的字符时必须要为其指定一个缓冲区大小,这个缓冲区大小将作为一个附加参数在读取字符时 立即传入到scanf_s()函数。例如读取一个字符串,容纳这个字符串的缓冲区大小就被作为附加参数传入到scanf_s()中。
char s[10];
scanf_s("%9s",s,10);
注:这个缓冲区大小包括了结束符NULL,读取指令将使用这个缓冲区大小去读取相应长度的字符到缓冲区中,如果没有指定缓冲区大小,或者要读取的字符(即从键盘输入的字符)大于指定的缓冲区大小,那么什么也不会写入到缓冲区中。 注意上面说的缓冲区包括了后面的结束符NULL ,是在字符串中而言。
读取一个字符
char c;
scanf_s("%c",&c,1);
读取多字节不带null结束的字符串时,整型可以用如下方式读取:
char c[4];
scanf_s("%4c",&c,4);
如果你需要在不同的编译器中去编译的话, 那么采用条件编译是最好的选择:
#define MS2010
double getNumber(const char* prompt)
{
double inputNumber = 0.0;
puts(prompt);
#ifdef MS2010
while((scanf_s("%lf",&inputNumber)) != 1)
#else
while((scanf("%lf",&inputNumber)) != 1)
#endif
{
while(getchar() != '\n');
printf("You must enter a NUMBER --%s",prompt);
}
while(getchar() != '\n');
return (inputNumber);
}
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
[参考链接:http://faculty.edcc.edu/paul.bladek/CS131/scanf_s.htm]
使用scanf_s报错:0xC0000005: Access violation writing location 0x00000000的更多相关文章
- QDomDocument Access violation writing location
今天犯了一个非常2的错误! 为了将面板参数保存起来,选择用QDomDocument构造Dom树,然后用doc.toString()方法返回符合xml格式的QString.如: QString CutF ...
- VS2010程序崩溃,报错Unhandled exception at **.exe:0xC0000005: Access violation reading location 0x000000008899.
最近被派到另外一个组支援,从而从Linux下开发暂转到Windows下开发,个人觉得Windows自己搞的一套并不那么完美,坑多. 网文可能出现的原因: 未处理的异常: 0xC0000005: 读取位 ...
- 0xC0000005: Access Violation -vc++6.0
0xC0000005: Access Violation -vc++6.0 aps001,002,003创建的C:\SMW200DATA\DATA,内容是不一样的,不通用的.读取相关文件就会报错咯. ...
- Solve Error: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Access violation.
在使用Visual Studio进行项目开发的时候,有时候会遇到下面这个错误: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Ac ...
- 启动报错:Access denied for user 'root'@'localhost' (using password:YES)
项目启动报错:Access denied for user 'root'@'localhost' (using password:YES) 原因:root帐户默认不开放远程访问权限,所以需要修改一下相 ...
- mysql报错sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER
mysql报错sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER 处理,在控制台 ...
- Jfinal报错sql injection violation, multi-statement not allow
Jfinal报错: com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: sql injection ...
- 远程连接Linux mysql报错:Access denied for user ‘root’@‘localhost’(using password: YES)的解决方法
在新安装好的Centos7上刚安装好mysql,准备进去看看,但是登陆的时候,发现报错啦: ERROR 1045 (28000): Access denied for user 'root'@'loc ...
- MAVEN报错Cannot access alimaven / idea data注解不好使
BUG 记录 报错页面的代码和截图: Cannot access alimaven (maven.aliyun.com/nexus/conte…..... 解决方法: 报错页面的代码和截图: JAR ...
随机推荐
- solrJ 查询参数
一. Query参数 1. CoreQueryParam查询的参数 1) q: 查询字符串,必须的. 2) q.op: 覆盖schema.xml的defaultOperator(有空格时用" ...
- LeetCode(15) 3Sum
题目 Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all ...
- hihocoder 1584 Bounce (数学 && 规律) ACM-ICPC北京赛区2017网络赛
题意: 给定一副n*m的格子图, 问从左上角的点开始往右下角滑,碰到墙壁就反弹, 碰到角落就停止, 问恰好经过一次的格子有多少个. 如图,恰好经过一次的格子有39个. 分析: 首先要引入两个概念, “ ...
- NGINX模块(一)
[NGINX核心模块] 1.主模块 该模块包含一些Nginx的基本控制功能. 指令1:daemon 语法:daemon on | off 默认值:on daemon off; 说明:生产环境中不要使用 ...
- 大数据学习——Linux上常用软件安装
4.1 Linux系统软件安装方式 Linux上的软件安装有以下几种常见方式: 1.二进制发布包 软件已经针对具体平台编译打包发布,只要解压,修改配置即可 2.RPM发布包 软件已经按照redhat的 ...
- json串转成list
List<BaseStaEmpEntity> baseStaEmpEntities = new ArrayList<>(); //json转List<baseStaEmp ...
- LR性能测试问题解决方法
一.Error -27727: Step download timeout (120 seconds)has expired when downloading resource(s). Set the ...
- xtu字符串 B. Power Strings
B. Power Strings Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java c ...
- 什么是Etcd?
文章大部分引至:http://jolestar.com/etcd-architecture/ Etcd 按照官方介绍 Etcd is a distributed, consistent key-val ...
- percona-toolkit工具安装
1.yum安装 yum install perl-TermReadKey.x86_64 yum install perl-IO-Socket-SSL yum install perl-DBI.x86_ ...