在调用sprintf函数格式化字符串时,会打印出意外的内容
printf("%d;%s;%s;%d;%d;\n", ptr->programmaType, ptr->titel, ptr->zender, ptr->start, ptr->einde);
打印“0; Stargate; scifi; 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使用单个参数时,我怀疑这是一个问题。
答案 0 :(得分:8)
您说ptr->start
和ptr->einde
是time_t
类型。此类型不是完全可移植的,可以是任何"integer or real-floating type",因此当您尝试将它们打印为int
类型时,系统可能无法正确处理它们。
尝试将其投射到已知的东西然后打印:
printf("%d;%s;%s;%ld;%ld;\n", ptr->programmaType, ptr->titel,
ptr->zender, (long)ptr->start, (long)ptr->einde);
答案 1 :(得分:1)
我猜您对ptr->einde
的定义 {<1}}的 。
您在int
说明符中使用的"%d"
需要printf
值。
使用正确的说明符来表示正确的类型和printf行为。
答案 2 :(得分:0)
否printf
的长度不受限制,但嵌入式实现除外,它必须能够打印至少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);