c - 如何以正确的顺序进行 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() 语句的情况下以正确的顺序获得输出?
解决方案
您发布的代码很好,冲洗不是答案。%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
首先被调用,然后是getVersion
and getCreationTime
。最后,printf
我们看到 prints libraryName
。
推荐阅读
- javascript - 带有自定义 Hook 的登录表单 React JS
- r - 如何在R中改变闪亮的曲线
- node.js - 错误 TS2305:模块“readline”没有导出的成员“接口”。- Firebase 功能
- c# - 回发期间应用程序缓存是否刷新其超时?
- c# - System.NullReferenceException:“对象引用未设置为对象的实例。” 问题
- javascript - 通过登录获取 Google Ads 客户 ID
- scala - 在 scala 中混合异步库和同步代码的最佳实践是什么
- ios - Swift 和 Firestore 安全规则、firebase 安全
- python - 使用 Python 编辑 Instagram 个人资料
- python - 我无法在 sklearn 管道中“通过”一步