【问题标题】:Why does this program give me a miscalculation only on the first input?为什么这个程序只在第一个输入时给我一个错误的计算?
【发布时间】:2017-05-10 00:24:51
【问题描述】:

这是我尝试在 C 中使用函数将华氏温度转换为摄氏温度。令我感到困惑的是,它适用于除第一个输入之外的所有输入,我不知道为什么。如果我删除了 while 循环,只是让程序中的内容按预期工作,但是我只能在必须再次运行程序之前转换一个值。输入的第一个值通常是 -16。给我的东西。

作为旁注,任何人都可以推荐一种在特定程序类型时搜索这些类型问题的方法吗?

    #include <stdio.h>

    float fToC(float far);

    int main()
    {
        int c;
        float far;
        while((c = getchar()) != EOF)
        {
        scanf("%f", &far);
        printf("%.2f\n", fToC(far));
        }
        return 0;
     }

    float fToC(float far)
    {
        float C;
        C = (5.0 / 9.0) * (far - 32.0);
        return C;
    }

【问题讨论】:

  • 你认为getchar 是做什么的?你如何处理它返回给你的价值?
  • getchar 从输入中读取一个字符。在第一个条目中,getchar “吞噬”了您输入的第一个数字,因此它读取的第一个数字是错误的。例如,如果您首先输入“54”,它将读取 5,将其丢弃,然后将 4 转换为摄氏度。随后的getchar 调用读取carrage return 或line feed,保持以下数字不变。在输入任何数字之前先尝试按 Enter。或者在您输入的第一个数字的第一个数字之前放置一个空格。你会看到这些会让它发挥作用。
  • @lurker 非常感谢,我现在明白了。如果您将其发布为答案,我会选择它作为该问题的最佳答案。

标签: c temperature


【解决方案1】:

是否需要getchar()?换行符(不可见字符)也是 视为输入。它保留在输入缓冲区中并被分配给far

跳过 getchar() 并输入 far。 如果输入了适当的输入,scanf() 将返回 1。 如果输入了不适当的输入(如字母),它将返回 0 并且根本不会进入循环。

    while((scanf("%f", &far) == 1))
    {
       printf( "far = %f\n", far);
       printf("%.2f\n", fToC(far));
    }

【讨论】:

    【解决方案2】:

    getchar() 吃掉第一个字符,而 scanf() 无法读取它。从第二次迭代开始,这没问题:吃掉的字符将是 '\n',然后是 scanf() 不读取的 ENTER 键。然而,第一次,这个字符是一个有用的字符:当输入“-16”时是“-”。解决方法:去掉getchar(),使用跳过空格的scanf解析格式:“%f”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多