繁体   English   中英

C函数printf()的长度有限吗?

[英]C function printf() limited in length?

在调用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是定义als time_t类型的,但看到printf只用一个参数我怀疑这是一个问题。

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

尝试将其投射到已知的东西然后打印:

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

我猜你对ptr->einde定义不是 int类型。

并且你在printf说明符中使用"%d" ,它需要一个int值。
使用正确的说明符来表示正确的类型和printf行为。

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

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM