首页 > 解决方案 > 如何以正确的顺序进行 printf() 打印输出?

问题描述

我有一个简单的工作函数,可以创建一个表记录文件信息。

但是,printf以错误的顺序打印我的输出。我尝试使用fflush(stdout)刷新缓冲区,但它没有改变任何东西。

功能:

void printTable(char *libraryName)
{

   printf("%-40s%-30s%-25s%-20s\n", "[File Name]", "[Creation Time]", "[Version]", "[Size]");
   fflush(stdout);
   printf("%-40s%-30d%-25d%-20f\n", libraryName, getCreationTime(libraryName), getVersion(libraryName), getSize(libraryName));
   fflush(stdout);

}

get 函数在单独的文件中定义并提供准确的输出。

编译后,输出如下所示:

[File Name]       [Creation Time]            [Version]       [Size]
125 kB
Version: 1.0.0.0 [6-02-2020 03:32:21 PM] Objects.dll

但它需要看起来像这样:

[File Name]       [Creation Time]            [Version]       [Size]
Objects.dll       [6-02-2020 03:32:21 PM]     1.0.0.0        125 kB

我需要对我的 printf() 函数做什么才能获得正确的订单输出?我试过刷新缓冲区并重新排列函数的顺序。是否可以在不为每个函数编写单独的 printf() 语句的情况下以正确的顺序获得输出?

标签: coutputprintf

解决方案


您发布的代码很好,冲洗不是答案。%d说明符无法打印像[6-02-2020 03:32:21 PM]and这样的字符串Version: 1.0.0.0,也不能%f导致125 kB.

我怀疑您的get函数正在打印它们的结果而不是返回它们,例如:

int getCreationTime(char *libraryName)
{
    printf("[6-02-2020 03:32:21 PM] ");
}

int getVersion(char *libraryName)
{
    printf("Version: 1.0.0.0 ");
}

double getSize(char *libraryName)
{
    printf("125 kB\n");
}

我不确定你返回什么。也许什么都没有?我觉得你有一些你忽略的编译器警告。如果是这样,请阅读它们并解决它们!

如果您想知道为什么结果会混淆,那是因为 C 不禁止以任何特定顺序(例如从左到右)对函数参数进行求值。看起来getSize首先被调用,然后是getVersionand getCreationTime。最后,printf我们看到 prints libraryName


推荐阅读