scanf使用%.2f就会出现错误的输出,而使用f就没问题,想知道是为什么?

scanf ("%.2f",&tall);
printf ("%.2f",tall);
上面打不出正确的答案
但是把scanf的.2f换成f就没问题,想问一下原因

scanf()格式转换的一般形式是
%[*][size][l][h]type
其中括号里的参数可选
size 为允许参数输入的数据长度
如果是scanf ("%.2f",&tall);
那么电脑会认为你要读入一个0.2位的数
但是那是不可能的
所以就输出0.00啦

scanf函数读取浮点数时,格式字符串中的%.2f表示要读取一个精确到小数点后两位的浮点数。而使用%f则表示读取一个普通的浮点数。

当你使用%.2f作为格式字符串时,scanf函数会尝试按照该格式读取输入的浮点数。如果输入的浮点数不符合该格式(例如输入的浮点数只有一位小数或没有小数),那么scanf函数会失败,返回一个非零值,并且不会对tall变量进行赋值。因此,当你尝试打印tall变量的值时,它仍然保持着初始值,而不是你输入的浮点数。

相反,如果你使用%f作为格式字符串,scanf函数会尝试读取一个普通的浮点数,即使输入的浮点数没有小数部分,也不会导致scanf函数失败。因此,tall变量会成功地被赋予输入的浮点数的值,你可以正确地打印出tall的值。

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7782627
  • 这篇博客也不错, 你可以看下scanf标准输出中不可以有%.2f
  • 除此之外, 这篇博客: 程序设计与算法 | (3) 输入输出与运算符、表达式中的 用scanf跳过输入中的字符 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 如果在输入中有scanf中出现的非控制字符(可以自行设置格式字符串),则这些字符会被跳过。

    #include <iostream> 
    #include <cstdio> 
    using namespace std; 
    int main()
    {
    	int n,m; char c; float f; 
    	scanf("%d %c,%f:%d",&n,&c,&f,&m); //输入中对应位置的 空格 , :会被跳过
    	printf("%d,%c,%f,%d",n,c,f,m); 
    	return 0;
    }
    

    在这里插入图片描述

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

    问题分析: 根据参考资料和已有知识,scanf函数在读取浮点数时,使用%.2f格式会导致错误的输出。而使用f格式则没有这个问题。原因可能是%.2f格式在读取浮点数时的机制不同。

    解决方案: 1. 使用%.2f格式读取浮点数时,首先确定输入的浮点数是否是正确的,即是否按照浮点数的格式输入。可以使用字符串来输入浮点数,然后通过sscanf函数将字符串转换为浮点数。

    #include <stdio.h>
    int main()
    {
        float f;
        char input[10];
        printf("请输入一个浮点数: ");
        fgets(input, sizeof(input), stdin); // 读取输入的字符串
        sscanf(input, "%f", &f); // 将字符串转换为浮点数
        printf("输入的浮点数为: %.2f\n", f);
        return 0;
    }
    

    这样可以避免使用scanf函数读取浮点数时可能出现的问题。

    1. 如果仍然希望使用scanf函数读取浮点数,并且使用%.2f格式,可以先读取一个字符串,然后通过sscanf函数将字符串转换为浮点数。
    #include <stdio.h>
    int main()
    {
        float f;
        char input[10];
        printf("请输入一个浮点数: ");
        fgets(input, sizeof(input), stdin); // 读取输入的字符串
        sscanf(input, "%f", &f); // 将字符串转换为浮点数
        printf("输入的浮点数为: %.2f\n", f);
        return 0;
    }
    

    这样可以确保输入的浮点数按照正确的格式输入,避免使用scanf函数时可能出现的问题。

    综上所述, 可以采取上述两种方案解决该问题。