scanf放在循环判断句里面或外面结果不一样

scanf放在循环判断句里面或者外面。运行结果不一样

{ 
    int b;
    while (scanf("%d", &b)!= 5)
    {
        if (5 > b)
            cout << "猜小了" << endl;
        else
            cout << "猜大了" << endl;
    }
      cout<<("猜对了");
}
 输入5,打印猜大了。

int main()
{ 
    int b;
    scanf("%d", &b);
    while (b!= 5)
    {
        if (5 > b)
            cout << "猜小了" << endl;
        else
            cout << "猜大了" << endl;
    }
      cout<<("猜对了");
}

打印猜对了

while (scanf("%d", &b)!= 5)
这个判断的不是b!=5而是scanf函数返回值!=5
而scanf函数返回值为成功读取的变量的个数

1.你把scanf放while前面,那只输入了一遍,而用这同一个值判断了5次
2.你不判断b==5,只要猜5次就算猜对了??

第一段:你的scanf放在while语句中就导致while的判断条件变为是判断scanf的返回值与5的比较,而scanf语句的返回值为成功输入变量的个数,所以输入5时scanf的返回值是不等于5的,进入while语句中后打印出猜大了。
第二段:是正确的形式。


int main()
{ 
    int b;
    scanf("%d", &b);
    while (b!= 5)
    {
        if (5 > b)
            cout << "猜小了" << endl;
        else
            cout << "猜大了" << endl;
        scanf("%d", &b);
    }
      cout<<("猜对了");
}

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7787764
  • 你也可以参考下这篇文章:scanf循环接收不确定数量的数据,并存入整型数组中
  • 同时,你还可以查看手册:c语言-scanf() 中的内容
  • 除此之外, 这篇博客: scanf 详解 - 你所不知道的scanf用法中的 ①.scanf的返回值是函数成功转换并存储于参数中的值的个数。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 代码如下:

        double a = 0;
        int b = 0;
        char c = 0;
        printf("请输入数据:>");
        int ret = scanf ("%lf%d%c", &a, &b, &c);
        printf("输出结果:%d", ret);
    

    运行结果:

    	请输入数据:>1.0 2c
    	输出结果:3
    

  • 您还可以看一下 传智老师的2016年c语言教程第3天课程中的 07 使用scanf函数一次接收输入多个数据小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    这个问题主要是因为scanf函数读取用户输入后会将换行符留在输入缓冲区中,导致下次循环读取时会直接读取到缓冲区中的换行符,而不是用户输入的值。所以,如果scanf函数放在循环判断语句内部,每次循环读取时都需要先清空缓冲区中的换行符,才能正确读取用户输入的值。

    优化解决方案:

    1. 在循环读取之前用getchar()清空缓冲区中的换行符:
    #include <stdio.h>
    
    int main() {
        int a = 0;
        int ret = 0;
        char c = 'a';
        while (1) {
            printf("请输入一个十六进制数:");
            ret = scanf("%x", &a);
            while ((c = getchar()) != '\n' && c != EOF) {} // 清空换行符
            if (ret == 1) {
                break;
            }
            printf("输入错误,请重新输入!\n");
        }
        printf("输入的十六进制数为:%#x\n", a);
        return 0;
    }
    
    1. 使用fgets获取用户输入,并用sscanf将输入转化为需要的数据类型:
    #include <stdio.h>
    
    int main() {
        char input[50];
        int a = 0;
        while (1) {
            printf("请输入一个十六进制数:");
            fgets(input, sizeof(input), stdin);
            if (sscanf(input, "%x", &a) == 1) {
                break;
            }
            printf("输入错误,请重新输入!\n");
        }
        printf("输入的十六进制数为:%#x\n", a);
        return 0;
    }