在C语言中使用scanf语句时遇到的问题总结
在使用visual studio2013编写c语言代码时,遇到了这样的几个小问题,进行如下的总结。
1, 关于使用scanf语句报错的解决方案1
- #include <stdio.h>
- int main(void)
- {
- char ch;
- printf("Please enter a character.\n");
- scanf("%c", &ch);
- printf("The code for %c is %d.\n", ch, ch);
- return ;
- }
如上所示的代码,之前在其他的编译平台,就可以正常的运行,例如运行时,你输入字母c,便会打印出The code for c is 67.但是在visual studio2013中运行会提示如下所示的错误:
error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
按照提示,我们更改scanf为scanf_s,再次运行,发现不再提示编译错误。仔细分析一下原因:
其实从官网文档中可以得知,出现这种问题,只是因为这是新版vc库添加的警告,微软认为scanf的使用存在安全隐患,因为C/C++中的字符串处理都是以\0为截止符的,如果搜索不到\0,容易出现字符串越界所有vc扩展的所谓安全标准库,都添加了一个参数用以指定字符串参数的长度,用以避免这种安全隐患。其实要避免出现这种问题,解决方法很简单,鼠标单击“项目文件”,按下Alt+Enter,显示如下界面,
点击c/c++,预处理器选项,选择右侧的预处理器定义,并选择编辑并在编辑框中添加一行内容_CRT_SECURE_NO_DEPRECATE就OK了。按下ctrl+F5运行程序不在报错,程序运行正常,
2.按照系统提示,更改scanf为scanf_s
如果,我们按照系统提示更改为scanf_s,我们运行程序,系统不再报错,但是程序运行时,我们同样输入输入C,查看结果如下所示,
那么问题又来了,无论我们我们输入什么字符,系统输出结果总是The code for is 0.只有是为什么呢,我们查看官方关于这个问题的解答(链接地址http://msdn.microsoft.com/en-us/library/w40768et.aspx),
a single character may be read as follows:
- <P>char c;
- <P>scanf_s("%c", &c, );</P>
When multiple characters for non-null terminated strings are read, integers are used as the width specification and the buffer size.
- <P>char c[];
- <P>scanf_s("%4c", &c, _countof(c)); // not null terminated</P>
原来是因为scanf_s在使用该功能是,有新的规定,必须在最后面声明要读取的字符串的长度,我们按照MSDN上面的备注,更改程序如下:
- #include <stdio.h>
- int main(void)
- {
- char ch;
- printf("Please enter a character.\n");
- scanf_s("%c", &ch,); //从键盘读取一个字符
- printf("The code for %c is %d.\n", ch, ch);
- return ;
- }
再次运行程序,输出结果如下:
总结:很多时候,官方文档是最权威的参考资料,作为一个开发者,学会高效的使用官方文档是尤为重要的。
在C语言中使用scanf语句时遇到的问题总结的更多相关文章
- C语言中关于scanf函数的用法
scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化 ...
- C语言中嵌入式SQL语句
原文:[转载]C语言中嵌入式SQL语句 http://blog.csdn.net/cnlht/archive/2007/12/12/1930960.aspx原文地址 实验内容: 掌握SQL Serve ...
- PL/SQL Developer中输入SQL语句时如何自动提示字段
在PL/SQL Developer中编写sql语句时,如果无法自动提示字段那是一件痛苦的事情,工作效率又低,在此演示下如何在PL/SQL Developer工具中自动提示字段,让开发者省时又省心,操作 ...
- 在c语言中嵌入汇编语句,对于我来说相当难。
今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言 ...
- mysql中,执行delete语句时出现Lock wait timeout exceeded问题
问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现错误.但过了一会再次 ...
- try catch finally语句块中存在return语句时的执行情况剖析
2种场景 (1) try中有return,finally中没有return(注意会改变返回值的情形);(2) try中有return,finally中有return; 场景代码分析(idea亲测) 场 ...
- C语言中的循环语句练习
注:练习题目均出自<明解C语言 入门篇> 一.do语句 1,求多个整数的和及平均值 #include<stdio.h> int main(void) { ; //和 ; //整 ...
- C 语言中的 switch 语句 case 后面是否需要加大括号
事件原由为编辑器的自动缩进,当 case 换行后不自动缩进. 于是在在想可以可否在 case 后面再大括号,让其自动缩进. 查了资料,发现 case 是可以加大括号的,相当于代码块. 而且还有另外一个 ...
- 用人类社会工程学对C语言中的一些基本概念的剖析与理解
最近在学C语言程序设计时总是遇到一些概念理解上的不清晰与混乱的地方,在一次偶然间想到了以前看过的一部电影<我是谁,没有一个系统是安全的>,里面的主角用社会工程学的想法结合黑客知识化险为夷, ...
随机推荐
- android Process.killProcess 和 System.exit(0) 区别
1 Process.killProcess 和 System.exit(0) 两个都会 kill 掉当前进程. 你可以打开 DDMS 查看进程号,或 adb shell 进入 shell 然后 ps ...
- 《More Effective C++》 条款5 谨慎定义类型转换函数
---恢复内容开始--- C++编译器能够在两种数据类型之间进行隐式转换(implicit conversions),它继承了C语言的转换方法,例如允许把char隐式转换为int和从short隐式转换 ...
- SQL Server 阻塞分析
一.加锁(locking).阻塞(blocking).死锁(deadlock)定义 加锁:用于管理多个连接的进程.当连接需要访问一块数据时,在这些数据上放置某种类型的锁. 阻塞 ...
- 深入浅出Node.js (11) - 产品化
11.1 项目工程化 11.1.1 目录结构 11.1.2 构建工具 11.1.3 编码规范 11.1.4 代码审查 11.2 部署流程 11.2.1 部署环境 11.2.2 部署操作 11.3 性能 ...
- Unity Diffuse Metal Shader Mod
Shader "MetalShader" { Properties { _MainTex ("Base (RGB) RefStrGloss (A)", 2D) ...
- IE浏览器兼容性的痛苦
做了一个弹出框的demo,在狐火,chrome,IE11中运行得好好的. 但是在IE8中死活不显示对话框,感觉IE8根本没有执行下面的javascript代码. 甚至,我简单的写alert(123), ...
- ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction差别
使用方法:@Html.Action(action, controller)加载局部页面.例如在模板页中使用:@Html.Action("Contact", "Compan ...
- ubuntu 100M 到 10M
浅析ubuntu下如何修改网卡网速--将100M网卡改为10M网卡 公司的路由器可能比较陈旧,机器启动之后,默认网卡是100M的,但是登录QQ经常出现掉线现象,后来得知原来需要将100M网卡降频到10 ...
- 20个 Unix/Linux 命令技巧
让我们用这些Unix/Linux命令技巧开启新的一年,提高在终端下的生产力.我已经找了很久了,现在就与你们分享. 删除一个大文件 我在生产服务器上有一个很大的200GB的日志文件需要删除.我的rm和l ...
- 390. Elimination Game
正规解法直接跳到代码上面一点的部分就可以了.但我想记录下自己的思考和尝试过程,希望二刷能看到问题所在. 找规律的时候写了好多,虽然规律很简单. 只要随便写3以上的例子,就应该发现,相邻的2个最后结果是 ...