关于scanf的问题

为什么scanf需要输入两次数据才有反应,一个很简单的比大小题目为例


```c
int main()//输入三个整数x,y,z,请把这三个数字由小到大输出
{
    int x = 0;
    int y = 0;
    int z = 0;
    scanf("%d %d %d", &x, &y, &z);
    int sum = x + y + z;
    int min = (x < y ? x : y) < z ? (x < y ? x : y) : z;
    int max=  (x > y ? x : y) > z ? (x > y ? x : y) : z;
    int mid = sum - min - max;
    printf("%d %d %d", min,mid,max);    
    return 0;
}

```

你输入啥了?截图看一下

scanf("%d %d %d", &x, &y, &z);
你输入的是3个数字,并且中间是英文半角的空格么

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/224377
  • 这篇博客也不错, 你可以看下C语言关于scanf的详细说明,连续scanf出错的原因,缓冲区有上次输入的垃圾!
  • 同时,你还可以查看手册:c语言-scanf() 中的内容
  • 除此之外, 这篇博客: 解决scanf函数不安全问题中的 解决scanf函数不安全问题。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 关于使用vs2013或者其他版本的小伙伴在最开始总会出现一个问题
    像下图
    在这里插入图片描述

    那就是例如scanf函数,编译器总会让你使用它自己规定的函数,说scanf函数不安全,但是呢,我们还是应该用类似于scanf这样的标准函数,而scanf-s只是这个编译器提供的函数,你无法保证在其他编译器还能使用,所以为了保证代码的可移植性和通用性,我们应该还是使用scanf函数。
    接下来我将为读者提供以下三种方法来解决这个问题

    复制这段错误原因,然后截取其中的 _CRT_SECURE_NO_WARNINGS ,然后在项目的开头用define定义。见下图
    在这里插入图片描述
    然后呢就可以啦!


    第二种呢是一种一劳永逸的方法
    我们先打开vs2013的文件所在地
    在这里插入图片描述
    然后点击Microsoft Visual Stdio 12.0,找到其下的VC文件夹 以及vcprojectitems文件夹
    在这里插入图片描述
    最终目的是为了找到图片中的newc++file.cpp,然后用记事本(打不开的话用notepad++)打开,并复制下之前的那段代码,保存,就可以了。
    在这里插入图片描述
    然后你每次新建项都会自动出现这个东西啦!


    第三种的话,类似与第一种,但是代码不同,因为下面的error是C4996,所以我们也可以添加以下代码
    #pragma warning(disable:4996)
    在这里插入图片描述
    同样也可以解决

    好了,以上就是我为大家分享的三种方法,其中第二种比较好,一劳永逸的解决这个问题。希望我的文章能帮助到阅读的你。
    向C语言进军冲冲冲!