在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 0;
}

如上所示的代码,之前在其他的编译平台,就可以正常的运行,例如运行时,你输入字母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", &amp;c, 1);</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[4];
<P>scanf_s("%4c", &amp;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,1);   //从键盘读取一个字符
    printf("The code for %c is %d.\n", ch, ch);

    return 0;
}

再次运行程序,输出结果如下:

总结:很多时候,官方文档是最权威的参考资料,作为一个开发者,学会高效的使用官方文档是尤为重要的。

时间: 2024-10-17 14:52:30

在C语言中使用scanf语句时遇到的问题总结的相关文章

C语言中嵌入式SQL语句

原文:[转载]C语言中嵌入式SQL语句 http://blog.csdn.net/cnlht/archive/2007/12/12/1930960.aspx原文地址 实验内容: 掌握SQL Server 2000的预编译程序NSQLPREP.EXE的使用(以课本例题1进行调试): 实验步骤: 一.数据库环境配置 1.创建xuesheng数据库,建立student表等: 2.关闭sql server 2000服务管理器: 3.将devtools文件夹拷贝到:C:\Program Files\Mic

C语言中关于scanf函数的用法

scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式. 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF. 其控制串由三类字符构成

PL/SQL Developer中输入SQL语句时如何自动提示字段

在PL/SQL Developer中编写sql语句时,如果无法自动提示字段那是一件痛苦的事情,工作效率又低,在此演示下如何在PL/SQL Developer工具中自动提示字段,让开发者省时又省心,操作步骤如下:tools–>preferences–>user interface–>code assistant–>在右边选中authomatically activated即可,如 PL/SQL Developer中输入SQL语句时如何自动提示字段,布布扣,bubuko.com

在c语言中嵌入汇编语句,对于我来说相当难。

今天早上在csdn论坛上看到一个帖子http://topic.csdn.net/u/20120917/14/82f42e17-977a-4824-95bd-7b79db15d283.html:“C语言中嵌入汇编,究竟有何意义?” 其中看到一个例子是在c语言中插入一段汇编代码获取CPU的主频,制造商和型号的: //=====================================================================================/*      

mysql中,执行delete语句时出现Lock wait timeout exceeded问题

问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现错误.但过了一会再次执行delete,就能成功删除记录了. 原因分析: 由于commit语句没有执行到,即事务没有提交成功,表还是被锁着的.只能等锁超时了,才能再次执行delete等操作. 解决办法: 1.遇到问题后可以kill掉对应的线程再次执行delete等操作. 2.为避免问题出现,可以开启mysql中的auto

C语言中的循环语句练习

注:练习题目均出自<明解C语言 入门篇> 一.do语句 1,求多个整数的和及平均值 #include<stdio.h> int main(void) { int sum = 0; //和 int cnt = 0; //整数个数 int retry; //判断是否继续 do{ int t; printf("请输入一个整数:"); scanf("%d",&t); sum = sum + t; cnt = cnt + 1; printf(&

mybatis中写sql语句时需要转义的字符

mybatis配置文件,sql语句中含有转义字符: 错误语句: select * from table_base where flag_topic  & #{topic_num} 错误信息: Caused by: org.xml.sax.SAXParseException; lineNumber: 8; columnNumber: 54; The entity name must immediately follow the '&' in the entity reference. 正确语

D语言中使用excode库时,需要单独编译

我把excode库源码放到我的工程中来后,每次编译时间都需要12s,非常糟糕.只是修改工程中的任意一个文件一行,编译也得要12s.不可思议. 只好把excode单独编译,不和我自己的工程放在一起.  ok了,一切正常.

Oracle中的sql脚本语言中的循环语句介绍

--sql脚本语言的循环介绍:--1.goto循环点.declare  x number;begin  x:=0;--变量初始化:  <<repeat_loop>>--设置循环点.  x:=x+1;  dbms_output.put_line(x);--循环体  if x<9 then            --进入循环的条件.    goto repeat_loop;   --用goto关键字引导进入循环.    end if;end; --2.for循环. declare