正如这里的多个问题也指出的那样,您可以printf
通过将精度设置为要打印的最大长度来格式化未终止的字符串。就像是
printf("%.*s\n", length, str);
Run Code Online (Sandbox Code Playgroud)
将打印length
开始于str
(或直到第一个 0 字节)的字符。
正如jonathan-leffler在此处指出的,这是由 posix here指定的。在阅读文档时,我发现它实际上从未说明这应该起作用(或者我找不到它),因为“ '%s' 转换会打印一个字符串。 ”和“一个字符串是一个以空字符结尾的字节数组 [ ...] ”。关于精度的注意事项说明“可以指定精度以指示要写入的最大字符数; ”。
我的解释是,上面的行实际上是未定义的行为,但是由于printf
的实现是有效的,它不会读取比写入更多的内容。
所以我的问题是:这种解释是否正确?
TLDR:当我尝试兼容 posix 时,我是否应该停止使用这个 printf 技巧,因为存在可能导致缓冲区溢出的实现?