【问题标题】:Printf ignoring null values?Printf 忽略空值?
【发布时间】:2011-08-05 17:24:10
【问题描述】:

我正在为嵌入式目标 Microchip PIC24 编写 C 代码,并且运行时 libc 由于某种原因无法通过串行端口正确发送 \0 值。

printf("\xEE\xEE\0test");

例如发送 EE EE "test",空字节被忽略。

有人知道为什么会这样吗?

编辑:Emmmm,没关系 XD。我正在使用 puts 发送字符串.. doh'

【问题讨论】:

  • 发送“EEEEtest”还是只发送“test”?

标签: c null embedded printf microchip


【解决方案1】:

空字符是 C 中的字符串终止符。printf 停在那里,因为就它而言,\0 是字符串的结尾。使用带有格式字符串的putchar()printf() 可能会起作用:

printf("%c", '\0');

如果您按照您的建议在线获得0xEE 0xEE test,您确定test 不是来自另一个printf 电话吗?

【讨论】:

  • 谢谢,你的评论让我意识到了一些愚蠢的错误。我正在通过一个 puts 传递 sprintf,所以虽然前者单独工作(格式字符串中的 \0),但第二个 puts 停止了字符串的中间。
【解决方案2】:

就 printf 而言,空字符表示字符串的结束。我很惊讶它会发送“测试”。您最好使用 write 系统调用,尤其是在串行端口上。

【讨论】:

  • 使用write()fwrite()。不同之处在于fwrite 进行缓冲并由C 标准定义(尽管独立实现不需要); write 由 POSIX 定义。您可能还需要确保流处于二进制模式。 stdout 默认情况下通常处于文本模式,但您的嵌入式目标的详细信息可能会有所不同。
猜你喜欢
  • 2014-03-27
  • 2019-02-27
  • 1970-01-01
  • 2023-03-17
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多