Answers:
snprintf()不会向缓冲区中写入超过<size>(snprintf的2d参数)字符,但它会计数(并丢弃多余的)字符,如果有足够的空间,它将写入该字符,这就是它返回的数字。是的,这可能会令人困惑!
snprintf
在很小的缓冲区中,记下返回的数字,然后再找到malloc
适当大小的缓冲区,然后再做一次。这样,您就知道要分配多少字节。
snprintf
在测量长度时,您什么也不能缓存(空目标指针明确描述为destlength == 0情况下的有效参数)。
Arduino Uno的测试草图:
char buffer[10];
void setup() {
Serial.begin(9600);
int n = snprintf(buffer, 2, "hello");
Serial.println(n);
Serial.println(buffer);
}
void loop() {
}
正如@JRobert所写,“必须”是关键。据我所知,只有snprintf和vsnprintf返回一个“将有”数字。
我认为原因是为了能够判断字符串是否被截断。假设'size'参数为25并且格式字符串很长,则可以针对25测试返回值。如果返回值为26(“将具有”字节数),则该字符串将被截断。
当“将有”编号不可用时,无法检索此信息。
asdf
包含“ hello”或“ h”?如果它包含“ h”,则该参数未被忽略。