我刚刚开始使用 ncurses
。数组 validity
定义为
static const char* validity[] = {
"invalid",
"valid"
};
允许我在必要时将 0
映射到 invalid
并将 1
映射到 valid
我的应用程序中的输出更具可读性。
我的代码中还有以下几行:
if(data->pos != NULL) {
mvprintw(4, 0,
"Position: X %5d Y %5d Z %5d \n",
data->pos->x, data->pos->y, data->pos->z);
// ...
}
这让我可以输出存储在 struct data
中的 3D 坐标,它每秒更新多次并填充新坐标。它可以正常工作。
接下来我要做的是使用 mvprintw(...)
输出单个字符串参数:
if(data->detected != NULL) {
mvprintw(5, 0,
"Detected: %s\n",
booleans[data->detected]);
}
其中 booleans
与 validity
数组非常相似,但其中包含 true
和 false
字符串以映射 bool 值字符串的值。这也行!
但是下面的代码输出了一个奇怪的结果:
if(data->validity_check != NULL) {
mvprintw(11, 0,
"Validity: %d [%s]\n",
data->validity_check->timestamp,
validity[data->validity_check->valid]);
}
validity_check
只是另一个 struct
,它包含一个 timestamp
(长整型)和一个 valid
标志可以是 0
或 1
。
输出应该看起来像
Validity: 123456789 [invalid]
但是我得到了
Validity: 123456789 [(null)]
我对此感到非常惊讶,并使用 printf()
进行输出以查看 valid
是否实际上包含有效数据(这是 C 数组的问题 -不检查越界)。结果:确实如此。这些值按预期在 0
和 1
之间跳跃。然而,出于某种原因,第二个论点似乎“被打破了”。我什至从数组中删除了检索并使用了硬编码参数值,但仍然没有变化。
进一步的调查使我重写了这部分代码,如下所示:
if(data->validity_check != NULL) {
mvprintw(11, 0,
"Validity: %d",
data->validity_check->timestamp);
printw(" [%s]\n", validity[data->validity_check->valid]);
}
它没有任何问题,我得到了想要的结果。但是我不知道我在这里做错了什么。我已经多次查看 documentation 但我可能遗漏了一些东西,因为我找不到任何可以解释这种行为的东西。
最佳答案
你写:
validity_check
is just anotherstruct
that contains atimestamp
(as long integer) and avalid
flag which can be either0
or1
.
如果 timestamp
是一个 long int
,你应该使用 %ld
格式而不是 %d
:
if (data->validity_check != NULL) {
mvprintw(11, 0,
"Validity: %ld [%s]\n",
data->validity_check->timestamp,
validity[data->validity_check->valid]);
}
printf
函数族是可变参数函数,格式字符串必须准确地告诉它们要使用的类型。 (这与普通函数不同,在普通函数中,参数的类型是已知的,类型会根据需要缩小或提升。)
这是一种常见的错误类型,但启用警告应该会告诉您此类格式不匹配,至少在 GCC 和 Clang 中是这样。
关于c - Ncurses - 当函数调用中存在多个参数时,为什么不使用 mvprintw() 打印字符串不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41636174/