【问题标题】:In C programming why is my printf not printing after a loop?在 C 编程中,为什么我的 printf 在循环后不打印?
【发布时间】:2019-02-16 23:44:30
【问题描述】:

我需要打印用户输入数组的总和和平均值。所以如果用户输入 2,4,6,9,10 它应该打印 6。 但是,循环结束后,我的 printf 没有打印任何内容。

即使我将 printf 放入数组中,它也只会打印出 0。

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    double num[6],average, sum=0, closest;
    printf("Enter 6 doubles\n");

    for (i=0; i<6; i++)
    {
    scanf("%lf",&num[i]);
    sum += num[i];

    }
    average = sum/i;
    printf("Average %d", average); 
}

【问题讨论】:

  • printf("Average %d", average); 行中,您需要使用格式说明符%f 来打印双精度。如果您使用 gcc 作为编译器,您可以使用编译器标志 -Wall 进行编译以查看相应的警告。
  • 也尝试添加\n --> printf("Average %e\n", average); "%e" 在调试方面比"%e" 提供更多信息。

标签: c printf


【解决方案1】:

您需要在代码中执行一些操作。您应该确保他们输入 6 个数字(在您的开篇帖子中您只列出 5 个,这会产生问题)。我更改了打印以使用它并删除了一些您不使用的变量。

#include <stdio.h>
#include <math.h>

int main()
{
    int i;
    double sum = 0;

    printf("Enter 6 doubles\n");
    for (i = 0; i < 6; i++)
    {
        double value;
        scanf("%lf", &value);
        sum += value;
    }

    printf("Average = %f", sum / i);
}

输入 6 个双打:

2 4 6 9 10 10

平均 = 6.833333

【讨论】:

    【解决方案2】:

    这个问题不是重复的,但我在 StackOverflow here 上找到了答案

    stdout 流被缓冲,所以只会显示 到达换行符(或被告知)后的缓冲区。你有一个 立即打印的几个选项:

    使用 fprintf 打印到 stderr:

    fprintf(stderr, "I will be printed immediately");

    在需要时刷新标准输出以使用 fflush:

    printf("Buffered, will be flushed"); fflush(stdout); // Will now print everything in the stdout buffer

    您还可以禁用缓冲 使用 setbuf 在标准输出上:

    setbuf(stdout, NULL);

    那么关于你的代码,这里有几点说明:

    • man 3 printf 中所述,转换说明符f 已经转换为双精度浮点值,因此不需要长度修饰符标志。
    • 平均值也是双精度值,因此如果将其打印为整数%d,您将丢失实际值部分,请考虑使用%f

    【讨论】:

      【解决方案3】:

      以下建议的代码:

      1. main() 使用正确的签名
      2. 将调用中使用的格式更正为printf()
      3. 在 'printf()' 中的格式字符串中附加一个 '\n',以便立即输出数据,而不是在程序退出后输出
      4. 给出“神奇”数字(即 6)有意义的名称
      5. 正确检查 I/O 错误并处理任何此类错误
      6. 消除不需要的变量
      7. 不包括那些内容没有使用的头文件
      8. 记录包含每个头文件的原因
      9. 适当限制局部变量“i”的范围
      10. 干净编译
      11. 执行所需的功能

      现在,建议的代码:

      #include <stdio.h>   // printf(), scanf(), perror()
      //#include <math.h>
      #include <stdlib.h>  // exit(), EXIT_FAILURE
      
      
      #define MAX_ENTRIES 6
      
      int main( void )
      {
          //int i;
          // double num[6];
          double num;
          double average;
          double sum=0.0;
          // double closest;
      
          printf("Enter %d doubles\n", MAX_ENTRIES );
      
          for (int i=0; i< MAX_ENTRIES; i++)
          {
              if( scanf( "%lf", &num ) != 1 )
              {
                  fprintf( stderr, "scanf for number failed\n" );
                  exit( EXIT_FAILURE );
              }
      
              sum += num;
          }
      
          average = sum / MAX_ENTRIES;
          printf("Average %f\n", average); 
      }
      

      代码的典型运行结果:

      Enter 6 doubles
      1.0
      2.0
      3.0
      4.0
      5.0
      6.0
      Average 3.500000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-23
        • 2020-01-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        相关资源
        最近更新 更多