2

在调用 sprintf 函数格式化字符串时,打印了一些意想不到的东西

printf("%d;%s;%s;%d;%d;\n", ptr->programmaType, ptr->titel, ptr->zender, ptr->start, ptr->einde);

打印“0;星际之门;科幻;0;0;” 尽管

printf("%d;", ptr->einde);

打印“42”,这是 ptr->einde 的值。我也试过

printf("%d;%s;%s;%d;%d;", 0, "Stargate", "scifi", 0, 42);

打印正确,所以我猜这个问题与变量有关。我尝试的最后一件事是

int bug = ptr->einde;
printf("%d;%s;%s;%d;%d;\n", ptr->programmaType, ptr->titel, ptr->zender, ptr->start, bug);

也无法正确打印...我不知道到底发生了什么。

注意: ptr->start 和 ptr->einde 被定义为 time_t 类型,但是看到 printf 使用单个参数我怀疑这是一个问题。

4

3 回答 3

8

你说的ptr->startptr->einde类型time_t。这种类型不是完全可移植的,可以是任何“整数或实浮点类型”int ,因此当您尝试将它们作为类型打印时,它们可能在您的系统上没有得到正确处理。

尝试将其转换为已知的内容,然后打印:

printf("%d;%s;%s;%ld;%ld;\n", ptr->programmaType, ptr->titel, 
    ptr->zender, (long)ptr->start, (long)ptr->einde);
于 2013-03-05T12:33:23.473 回答
1

我猜你的定义ptr->einde不是type 。int

并且您"%d"在期望值的printf说明符中使用int
为正确的类型和 printf 行为使用正确的说明符。

于 2013-03-05T12:30:32.073 回答
0

Noprintf的长度不受限制,除非在嵌入式实现中它必须能够打印至少 4095 个字符。

time_t可能是一个 64 位整数值。解决方案是将变量转换为(uint64_t)并使用PRIu64格式说明符。

printf("%d;%s;%s;%"PRIu64";%"PRIu64";\n", 
           ptr->programmaType, 
           ptr->titel, ptr->zender, 
           (uint64_t)ptr->start, 
           (uint64_t)ptr->einde);
于 2013-03-05T12:38:52.763 回答