使用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 ...
随机推荐
- Python中的数据类型常见方法
list() 方法 1.cmp(list1, list2):#比较两个列表的元素 2.len(list):#列表元素个数 3.max(list):#返回列表元素最大值 4.min(list):#返回列 ...
- 杭电 1856 More is better (并查集求最大集合)
Description Mr Wang wants some boys to help him with a project. Because the project is rather comple ...
- 【HIHOCODER 1526】 序列的值(二进制DP)
时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个长度为 n 的序列 a[1..n],定义函数 f(b[1..m]) 的值为在 [0,m-1] 内满足如下条件的 i ...
- mybatis动态sql foreach的用法
<select id="findUserByIds" parameterType="com.pojo.QueryVo" resultType=" ...
- CDOJ 1218 Pick The Sticks
Pick The Sticks Time Limit: 15000/10000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others ...
- hexo干货系列:(三)hexo的Jacman主题优化
前言 上一篇介绍了Jacman主题的安装和配置,今天根据上次的基础做了些优化,让博客看起来很舒服. 正文 首页文章展示摘要 该主题首页文章列表默认是全部展开,感觉不好,我关闭掉了,只展示少量摘要. 修 ...
- HUD-1559 最大子矩阵,dp模拟
最大子矩阵 ...
- SQL2012通用分页存储过程
--提取分页数据,返回总记录数 Createprocedure [dbo].[sp_Common_GetDataPaging_ReturnDataCount] ( @SqlString varchar ...
- 洛谷P1757 通天之分组背包
题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品相互冲突,现在,他想知道最大 ...
- Android应用的权限配置和权限列表
权限配置写在Mainifest.xml文件中: <?xml version="1.0" encoding="utf-8"?> <manifes ...