正如这里的多个问题所指出的那样,您可以通过将精度格式化为要打印的最大长度来printf非终止字符串。例如:
printf("%.*s\n", length, str);
会打印从 str
开始的 length
个字符(或直到第一个0个字节)。
正如jonathan-leffler在这里指出的那样,这是由posix规定的。而且在阅读文档时,我发现它实际上从未说明这应该起作用(或者我找不到),“‘%s’转换打印字符串。 ”和“字符串是空字符结尾的字节数组[...] ”。关于精度的方面说明了“可以指定精度以指示要写入的最大字符数;”。
我的解释是上述行为实际上是未定义行为,但因为printf
的实现效率高,它不会读取多于写入的内容。
所以我的问题是:这个解释是正确的吗?
TLDR:当我尝试posix兼容时,是否应该停止使用此printf技巧,因为存在可能导致缓冲区溢出的实现?
fwrite
而无需进行任何其他逻辑。 - William Pursellfwrite
同等水平 吗? - Eugene Sh.