如何得知格式化后字符串的总大小?
例如:
"<xml id=\"%d\">%s</xml>"
我需要分配一个字符串来调用
sprintf
或 snprintf
来填充该字符串,但我不想假设一个值,例如 4096 或其他固定值。
如何得知格式化后字符串的总大小?
例如:
"<xml id=\"%d\">%s</xml>"
我需要分配一个字符串来调用
sprintf
或 snprintf
来填充该字符串,但我不想假设一个值,例如 4096 或其他固定值。
这可以通过拨打
snprintf
两次来完成。
第一次,我们称之为传递 NULL 作为缓冲区和零作为大小:
int size = snprintf(NULL, 0, "<xml id=\"%d\">%s</xml>", report_id, report_content) + 1;
末尾有
+1
非常重要,因为我们需要考虑字符串末尾的 \0
字符
现在我们可以分配正确大小的缓冲区了:
char *buffer = malloc(size * sizeof(buffer));
现在,最后,我们用我们创建的缓冲区调用
snprintf
:
snprintf(buffer, size, "<xml id=\"%d\">%s</xml>", report_id, report_content);
在两次调用中使用相同的字符串和参数也非常重要
snprintf