Ncurses - 当函数调用中的多个参数不存在时,为什么不使用mvprintw()打印字符串?

时间:2017-01-13 13:53:22

标签: c arrays string ncurses

我刚开始使用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]);
}

其中booleansvalidity数组非常相似,但内部有truefalse个字符串,用于将布尔值映射到字符串。这也有效!

但是,以下代码会输出一个奇怪的结果:

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 }}

输出应该看起来像

1

但我得到了

Validity:    123456789 [invalid]

我对此感到非常惊讶并使用Validity: 123456789 [(null)] 输出以查看printf()是否实际包含有效数据(这是C阵列的问题 - 没有检查出来的界限)。结果:它做到了。正如预期的那样,值在valid0之间跳跃。然而,出于某种原因,第二个论点似乎是#34;破坏了#34;。我甚至从数组中删除了检索并使用了硬编码的参数值,但仍然没有变化。

进一步的调查使我重写了这部分代码:

1

它没有任何问题,我得到了理想的结果。但是我不知道我在这里做错了什么。我已多次查看documentation但我可能遗漏了一些东西,因为我无法找到任何可以解释此行为的内容。

1 个答案:

答案 0 :(得分:2)

你写道:

  

validity_check只是另一个struct,其中包含timestamp(长整数)和valid标记,可以是0或{{1 }}

如果1timestamp,则应使用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]); } 函数族是变量函数,格式字符串必须告诉它们确切使用哪种类型。 (这与普通函数不同,其中参数的类型是已知的,类型会根据需要变窄或提升。)

这是一种常见的错误类型,但是启用警告应该告诉您这种格式不匹配,至少在GCC和Clang中。