使用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 ...
随机推荐
- Django之学员管理二
Django之学员管理二 学生表的一对多的增删改查 views.py def students(request): #select students.sid,students.name,classes ...
- CS academy Growing Trees【模板】DP求树的直径
[题意概述] 给出一棵树,树上的边有两个值a和b,你可以在[0,limit]范围内选择一个整数delta,树上的边的权值为a+b*delta,现在问当delta为多少的时候树的直径最小.最小直径是多少 ...
- OI中的小智慧
反正不会咕咕的. sort之类没+1的问题不说 双向边n*2的问题不说 变量n+5的问题不说 1.先生成后判断 (见NOIP 2016 pj t2回文日期) 这个思想在这道题体现的不明显,记得洛谷上面 ...
- ExtJs 滚动条问题
bodyStyle :'overflow-x:visible;overflow-y:scroll', //隐藏水平滚动条 通过这个方法可以显示或隐藏滚动条 var form = new Ext.for ...
- python和搜索
# -*- coding: UTF-8 -*- import re # 搜索逻辑 def querylogic(list): query = {} if len(list) > 1 or len ...
- JIRA 6.3.6安装
一:下载JIRA 从官网下载:https://www.atlassian.com/software/jira/download 我下载的版本是Linux版的 JIRA 6.3.6 wget http: ...
- poj 3417 Network 题解
题意: 先给出一棵树,然后再给出m条边,把这m条边连上,然后剪掉两条边,一条是原边,一条是新边,问有多少种方案能使图不连通. 思路: 从原边的角度看 1.树加边,一定成环,加一条(u,v)边就有u-& ...
- 多边形之战(bzoj 2927)
Description 多边形之战是一个双人游戏.游戏在一个有n个顶点的凸多边形上进行,这个凸多边形的n-3条对角线将多边形分成n-2个三角形,这n-3条对角线在多边形的顶点相交.三角形中的一个被染成 ...
- oc温习七:结构体与枚举
结构体和枚举都是一种存储复杂的数据.结构体是用户自定义的一种类型,不同类型的集合. 1.结构体的创建及使用 定义结构体类型 struct MyDate { int year; int month; i ...
- 免费SSL申请
https://letsencrypt.org/ https://letsencrypt.org/docs/client-options/ ACMESharp (.NET, PowerShell) w ...