【问题标题】:Printf format string issue(PW.BAD_PRINTF_FORMAT_STRING)Printf 格式字符串问题(PW.BAD_PRINTF_FORMAT_STRING)
【发布时间】:2019-09-02 20:31:55
【问题描述】:
sprintf(xBuffer,"%l",rootCause)

rootCauseunsigned long

bad_printf_format_string:格式字符串转换无效

sprintf(buffId,"Ox%lx Ox%lx Ox%lx", canSnifferMsg.nodeId, canSnifferMsg.index, canSnifferMsg.subindex);

这个呢? nodeId,index,subindex都是longs

【问题讨论】:

  • 您是否考虑过%l 不是有效格式字符串的可能性?
  • 你是什么意思'这个怎么样',这段代码工作正常。有什么问题?
  • niketa ,sprintf(buffId,"Ox%ld Ox%ld Ox%ld", canSnifferMsg.nodeId, canSnifferMsg.index, canSnifferMsg.subindex); 是否还有同样的问题?

标签: c printf


【解决方案1】:

无符号长的正确格式字符串是%lu
可以在here 找到格式说明符列表。
here 有人问过类似的问题。

%lx 用于获取数字的十六进制表示。因此,它是无符号的还是有符号的都无关紧要,因为使用 2 的补码而不是负号。

如果您想打印一个常规的长数字,您可以使用我发送的第一个链接中指定的%ld%li

例子:

unsigned long a = (unsigned long)(-25);
char buff[100];

sprintf(buff, "%lu %lx %ld", a, a, a);

printf("%s", buff);

输出:

4294967271 ffffffe7 -25

【讨论】:

  • sprintf(buffId,"Ox%lx Ox%lx Ox%lx", canSnifferMsg.nodeId, canSnifferMsg.index, canSnifferMsg.subindex);这个呢...nodeId ,index,subindex 都是长的
  • @niketa 用于十六进制输出。仔细查看 printf 手册页将是一个很好的起点。
  • “因此,如果它被签名是无关紧要的,因为使用 2 的补码而不是负号”。 --> 不同意:使用"%lx" 打印带有负值的long 是未定义的行为UB。使用 "%ld" 打印具有值 > LONG_MAXunsigned long 也是 UB。不过,我从未见过这个 UB 是个问题。
  • @chux 我认为这是一个演员表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
  • 2023-01-12
  • 2011-11-13
  • 2021-08-13
  • 2012-01-26
相关资源
最近更新 更多