在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);

如果你需要在不同的编译器中去编译的话, 那么采用条件编译是最好的选择:

  1.  
  1. #define MS2010
  1. double getNumber(const char* prompt)
  1. {
  1. double inputNumber = 0.0;
  1. puts(prompt);
  1. #ifdef MS2010
  1. while((scanf_s("%lf",&inputNumber)) != 1)
  1. #else
  1. while((scanf("%lf",&inputNumber)) != 1)
  1. #endif
  1. {
  1. while(getchar() != '\n');
  1. printf("You must enter a NUMBER --%s",prompt);
  1. }
  1. while(getchar() != '\n');
  1. return (inputNumber);
  1. }
  1.  
  1.  

.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的更多相关文章

  1. QDomDocument Access violation writing location

    今天犯了一个非常2的错误! 为了将面板参数保存起来,选择用QDomDocument构造Dom树,然后用doc.toString()方法返回符合xml格式的QString.如: QString CutF ...

  2. VS2010程序崩溃,报错Unhandled exception at **.exe:0xC0000005: Access violation reading location 0x000000008899.

    最近被派到另外一个组支援,从而从Linux下开发暂转到Windows下开发,个人觉得Windows自己搞的一套并不那么完美,坑多. 网文可能出现的原因: 未处理的异常: 0xC0000005: 读取位 ...

  3. 0xC0000005: Access Violation -vc++6.0

    0xC0000005: Access Violation -vc++6.0 aps001,002,003创建的C:\SMW200DATA\DATA,内容是不一样的,不通用的.读取相关文件就会报错咯. ...

  4. Solve Error: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Access violation.

    在使用Visual Studio进行项目开发的时候,有时候会遇到下面这个错误: Unhandled exception at 0x00905a4d in xxx.exe: 0xC0000005: Ac ...

  5. 启动报错:Access denied for user 'root'@'localhost' (using password:YES)

    项目启动报错:Access denied for user 'root'@'localhost' (using password:YES) 原因:root帐户默认不开放远程访问权限,所以需要修改一下相 ...

  6. mysql报错sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER

    mysql报错sql injection violation, syntax error: syntax error, expect RPAREN, actual IDENTIFIER 处理,在控制台 ...

  7. Jfinal报错sql injection violation, multi-statement not allow

    Jfinal报错: com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLException: sql injection ...

  8. 远程连接Linux mysql报错:Access denied for user ‘root’@‘localhost’(using password: YES)的解决方法

    在新安装好的Centos7上刚安装好mysql,准备进去看看,但是登陆的时候,发现报错啦: ERROR 1045 (28000): Access denied for user 'root'@'loc ...

  9. MAVEN报错Cannot access alimaven / idea data注解不好使

    BUG 记录 报错页面的代码和截图: Cannot access alimaven (maven.aliyun.com/nexus/conte…..... 解决方法: 报错页面的代码和截图: JAR ...

随机推荐

  1. Ubuntu配置TFTP服务器

    TFTP(Trivial File Transfer Protocol,简单文件传输协议)是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议,提供不复杂.开销不大的文件传输服务 ...

  2. mysql EXPLAIN Join Types 手册解释 及数据实操

     第一部分:名称解释 文档地址 https://dev.mysql.com/doc/refman/5.7/en/explain-output.html EXPLAIN Join Types: The ...

  3. LeetCode(12)Integer to Roman

    题目 Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from ...

  4. SQL 一次插入多条记录

    本文介绍如何快速插入多条数据到数据表中,以满足sql语句学习或项目测试的需要. 本文非原创,是对移步原文的重新整理. 如有以下表格,如图: 1,原始添加记录的方式,sql语句如下: insert in ...

  5. 【01】在 Github 上编辑代码

    [01]在 Github 上编辑代码 当你使用 GitHub,看一些文件(任何的文本文件或者仓库),能看到一个顶部右侧有一个小铅笔图标.点击即可编辑文档. 完成后,按照提示点击「Propose fil ...

  6. FTS5与DIY

    此文已由作者王荣涛授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. FTS5简介 前文已经介绍了FTS3/FTS4,本文着重介绍它们的继任者FTS5. FTS5是在SQLite ...

  7. 大数据学习——采集目录到HDFS

    采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 l  采集源,即source——监控文件目录 :  spoold ...

  8. resultType返回的是集合中的元素类型

    https://www.cnblogs.com/start-fxw/p/5900087.html

  9. sequence(bzoj 1367)

    Description Input Output 一个整数R Sample Input 794820141518 Sample Output 13 HINT 所求的Z序列为6,7,8,13,14,15 ...

  10. Javascript 检查字符串是否是数字的几种方法

    //判断是否是正整数 function IsNum(s) { if(s!=null){ var r,re; re = /\d*/i; //\d表示数字,*表示匹配多个数字 r = s.match(re ...