• C语言中的scanf与scanf_s 以及循环输入的问题解决


    Scanf

        在标准C中,scanf提供了键盘输入功能。

        scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为:

        scanf(“格式控制字符串”, 地址表列);

        其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。

    Scanf_s

        在VS2019,包括以前的一些版本中,scanf会报错:

     

     这时我建议使用Scanf。

    ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内在泄露。所以VS中提供了scanf_s(),在调用时,必须提供一个数字以表明最多读取多少位字符。

    当然这里报错你也可以依据网上提供的修改宏或者修改一些VS配置来直接运行。

    但是scanf不会检查边界,读取一旦越界,数据就会存储到其他地址空间,运行就会报错,这里很麻烦。

    所以建议使用scanf_s().

    在循环中使用scanf_s();

     

    这是顺序表实现中的一段代码。如图所示,如果你想使用循环输入,需要在scanf_s前面加上fflush(stdin)方法清除缓存区或者在scanf_s方法下面加getchar()方法。

    这是因为scanf_s返回值中的回车所造成的。

    这里放一张错误样例的截图:

     

    可以看到,这里点击回车后直接跳过一次输入。

    注:由于未知原因,我这里使用fflush(stdin)失效。如果遇到同样问题可以尝试getcar().

  • 相关阅读:
    C. Shaass and Lights 解析(思維、組合)
    D. Binary String To Subsequences(队列)(贪心)
    CodeForces 1384B2. Koa and the Beach (Hard Version)(贪心)
    CodeForces 1384B1. Koa and the Beach (Easy Version)(搜索)
    CodeForces 1384C. String Transformation 1(贪心)(并查集)
    CodeForces 1384A. Common Prefixes
    POJ-2516 Minimum Cost(最小费用最大流)
    POJ3261-Milk Patterns(后缀数组)
    HDU-1300 Pearls(斜率DP)
    HDU-4528 小明系列故事-捉迷藏(BFS)
  • 原文地址:https://www.cnblogs.com/ambdyx/p/11627303.html
Copyright © 2020-2023  润新知