小编Poo*_*ohl的帖子

printf-ing 非 0 终止字符串时使用 percison 的可移植性

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

printf("%.*s\n", length, str);
Run Code Online (Sandbox Code Playgroud)

将打印length开始于str(或直到第一个 0 字节)的字符。

正如jonathan-leffler在此处指出的,这是由 posix here指定的。在阅读文档时,我发现它实际上从未说明这应该起作用(或者我找不到它),因为“ '%s' 转换会打印一个字符串。 ”和“一个字符串是一个以空字符结尾的字节数组 [ ...] ”。关于精度的注意事项说明“可以指定精度以指示要写入的最大字符数; ”。

我的解释是,上面的行实际上是未定义的行为,但是由于printf的实现是有效的,它不会读取写入更多的内容。

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

TLDR:当我尝试兼容 posix 时,我是否应该停止使用这个 printf 技巧,因为存在可能导致缓冲区溢出的实现?

c printf posix c-strings

5
推荐指数
1
解决办法
37
查看次数

标签 统计

c ×1

c-strings ×1

posix ×1

printf ×1