• 在C语言中使用scanf语句时遇到的问题总结


        在使用visual studio2013编写c语言代码时,遇到了这样的几个小问题,进行如下的总结。

    1, 关于使用scanf语句报错的解决方案1

    #include <stdio.h>
    int main(void)
    {
        char ch;
    
        printf("Please enter a character.
    ");
        scanf("%c", &ch);   
        printf("The code for %c is %d.
    ", 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++中的字符串处理都是以为截止符的,如果搜索不到,容易出现字符串越界所有vc扩展的所谓安全标准库,都添加了一个参数用以指定字符串参数的长度,用以避免这种安全隐患。其实要避免出现这种问题,解决方法很简单,鼠标单击“项目文件”,按下Alt+Enter,显示如下界面,

    demo1

        点击c/c++,预处理器选项,选择右侧的预处理器定义,并选择编辑并在编辑框中添加一行内容_CRT_SECURE_NO_DEPRECATE就OK了。按下ctrl+F5运行程序不在报错,程序运行正常,

    DEMO2

    2.按照系统提示,更改scanf为scanf_s

        如果,我们按照系统提示更改为scanf_s,我们运行程序,系统不再报错,但是程序运行时,我们同样输入输入C,查看结果如下所示,

    DEMO3

        那么问题又来了,无论我们我们输入什么字符,系统输出结果总是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.
    ");
        scanf_s("%c", &ch,1);   //从键盘读取一个字符
        printf("The code for %c is %d.
    ", ch, ch);
    
        return 0;
    }

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

    DEMO4

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

  • 相关阅读:
    linux 修改环境变量 vi ~/.bashrc 出错解决办法,很有效
    大体学习框架
    完成spring boot整合ehcache的搭建以支持服务本地堆缓存
    Springboot隐藏某个字段@JSONField(serialize = false)不生效问题解决
    在库存服务中实现缓存与数据库双写一致性保障方案(二)
    restful api版本控制
    手机连接小爱同学音响
    商品详情页结构分析、缓存全量更新问题以及缓存维度化解决方案
    zk安装
    在库存服务中实现缓存与数据库双写一致性保障方案(四)
  • 原文地址:https://www.cnblogs.com/xulan-2015/p/4232343.html
Copyright © 2020-2023  润新知