当打印非0终止的字符串时可以使用percison

Poohl

正如这里的多个问题所指出的那样,您可以printf通过精确格式化作为要打印的最大长度来设置非终止字符串。就像是

printf("%.*s\n", length, str);

将打印lengthstr(或直到第一个0字节)的字符。

正如jonathan-leffler在这里指出的,这由posix在此处指定而且当我阅读文档时,我发现它实际上从未声明过应该工作(或者我找不到),因为“ '%s'转换会打印一个字符串。 ”和“字符串是一个以空值终止的字节数组[ ...] ”。“关于精度状态下的方面可以被指定的精度,以指示字符的最大数目的写入; ”。

我的解释是,上面的代码行实际上是未定义的行为,但是由于printf的实现是高效的,因此读取的内容并不多于写入的内容

所以我的问题是:这种解释正确吗?

TLDR:由于要实现posix兼容,我是否应该停止使用此printf技巧,因为存在可能导致缓冲区溢出的实现?

内特·艾德雷奇(Nate Eldredge)

您所阅读的不是真正的POSIX规范,而是GNU libc手册,出于可读性考虑,该手册的精确度往往有所降低。实际的规范可以在https://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html上找到(它甚至与您链接到的Jonathan Leffler的答案链接),而且很清楚您的代码很好:

s该参数应为指向char数组的指针。数组中的字节应被写入(但不包括)任何终止的空字节。如果规定了精度,则写入的字节数不得超过该字节数。如果未指定精度或大于数组的大小,则应用程序应确保该数组包含一个空字节。

请注意,出于您指出的确切原因,他们要小心不要使用单词“字符串”。

ISO C17标准使用几乎相同的语言,因此您的代码甚至可以移植到非POSIX标准C实现中。(POSIX通常包含ISO C,并且POSIX规范的许多部分都是从C标准复制/粘贴的。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可以使用%s打印字符串的最大大小吗?

来自分类Dev

使用 LinkText 时可以使用字符串变量吗?

来自分类Dev

为什么此非空终止的字符串正确打印

来自分类Dev

键为字符串时可以使用assoc吗?

来自分类Dev

当查询字符串过于复杂时,可以使用HttpPost代替HttpGet吗?

来自分类Dev

是否可以使用Dotfuscator更改字符串?

来自分类Dev

我可以使用通配符比较字符串吗?

来自分类Dev

在.NET中,如何释放由OLE分配的0终止的非托管Unicode字符串的内存?

来自分类Dev

为什么有时不使用原始字符串就可以使用Python正则表达式字符串?

来自分类Dev

使用动态连接字符串构建器时,是否可以使用Ninject将接口绑定到该实体?

来自分类Dev

空终止字符串:使用'\ 0'还是仅使用0?

来自分类Dev

如何使用空字符串终止?

来自分类Dev

没有元素时,可以使用CSS选择器在列表中获取空字符串吗?

来自分类Dev

使用int替代品打印以%.0f格式化的字符串时出错

来自分类Dev

使用Encoding.ANSI或Encoding.Unicode时获取以Null终止的字符串

来自分类Dev

在哪里可以找到NSDateFormatter可以使用的格式字符串模式的表?

来自分类Dev

是否可以使用条件选择的字符串文字初始化字符数组?

来自分类Dev

使用字符串插值时是否可以混合字符串资源?

来自分类Dev

是否可以使用Pig在GENERATE条件中将长字符串转换成字符串?

来自分类Dev

我可以使用字符串或IEnumerable <T>,其中T是字符串或IEnumerable <T>吗?

来自分类Dev

是否可以使用Pig在GENERATE条件中将长字符串转换成字符串?

来自分类Dev

为什么不能重新分配字符串数组,但是字符串指针可以使用C语言?

来自分类Dev

Powershell-输出特定字符串时终止命令

来自分类Dev

如何使用空字符终止字符串

来自分类Dev

清理字符串以使用angularjs

来自分类Dev

我可以使用格式而不使用子字符串吗?

来自分类Dev

是否可以使用非 ANSI 颜色从 Python 打印?

来自分类Dev

不能使用var_dump,echo或print_r字符串,但是可以使用字符串,并且可以输出单个字符

来自分类Dev

打印字符串时正在打印(null)

Related 相关文章

  1. 1

    可以使用%s打印字符串的最大大小吗?

  2. 2

    使用 LinkText 时可以使用字符串变量吗?

  3. 3

    为什么此非空终止的字符串正确打印

  4. 4

    键为字符串时可以使用assoc吗?

  5. 5

    当查询字符串过于复杂时,可以使用HttpPost代替HttpGet吗?

  6. 6

    是否可以使用Dotfuscator更改字符串?

  7. 7

    我可以使用通配符比较字符串吗?

  8. 8

    在.NET中,如何释放由OLE分配的0终止的非托管Unicode字符串的内存?

  9. 9

    为什么有时不使用原始字符串就可以使用Python正则表达式字符串?

  10. 10

    使用动态连接字符串构建器时,是否可以使用Ninject将接口绑定到该实体?

  11. 11

    空终止字符串:使用'\ 0'还是仅使用0?

  12. 12

    如何使用空字符串终止?

  13. 13

    没有元素时,可以使用CSS选择器在列表中获取空字符串吗?

  14. 14

    使用int替代品打印以%.0f格式化的字符串时出错

  15. 15

    使用Encoding.ANSI或Encoding.Unicode时获取以Null终止的字符串

  16. 16

    在哪里可以找到NSDateFormatter可以使用的格式字符串模式的表?

  17. 17

    是否可以使用条件选择的字符串文字初始化字符数组?

  18. 18

    使用字符串插值时是否可以混合字符串资源?

  19. 19

    是否可以使用Pig在GENERATE条件中将长字符串转换成字符串?

  20. 20

    我可以使用字符串或IEnumerable <T>,其中T是字符串或IEnumerable <T>吗?

  21. 21

    是否可以使用Pig在GENERATE条件中将长字符串转换成字符串?

  22. 22

    为什么不能重新分配字符串数组,但是字符串指针可以使用C语言?

  23. 23

    Powershell-输出特定字符串时终止命令

  24. 24

    如何使用空字符终止字符串

  25. 25

    清理字符串以使用angularjs

  26. 26

    我可以使用格式而不使用子字符串吗?

  27. 27

    是否可以使用非 ANSI 颜色从 Python 打印?

  28. 28

    不能使用var_dump,echo或print_r字符串,但是可以使用字符串,并且可以输出单个字符

  29. 29

    打印字符串时正在打印(null)

热门标签

归档