以下 C 函数:
int sprintf ( char * str, const char * format, ... );
将格式化数据写入字符串。作为 str 传递的数组的大小应该足以包含整个格式化字符串。但是,如果事先不知道格式化字符串的长度怎么办?如何使用此函数(或其他类似函数)写入长度未知的格式化数据?
例如:
#include <stdio.h>
int main ()
{
char buffer [13];
int n, a=5, b=3;
n=sprintf (buffer, "%d plus %d is %d", a, b, a+b);
printf ("[%s] is a %d char long string\n",buffer,n);
return 0;
}
缓冲区需要为 13 或更大才能使其工作。如果字符串长度未知,并且缓冲区(例如)已设置为 5,则这将不起作用。我需要一些可以为恰好大于缓冲区的字符串动态分配或重新分配缓冲区的东西。
最佳答案
使用 snprintf
大多数人会告诉您使用 snprintf()
,因为它不会溢出缓冲区的末尾。
这是个不错的建议。通常的“设计模式”是声明一个临时的固定大小的缓冲区,该缓冲区比字符串可能的大小要大,snprintf()
就是这样。如果字符串需要保存一段时间,你可以测量它的长度,malloc(3)
另一个,strcpy(3)
临时缓冲区到半永久malloc()
缓冲区。
两次通过的方法
还有另一种方式。
C99 指定如果缓冲区为 NULL,则不写入任何字节,但会返回实际写入的长度。这允许您执行虚拟的第一次传递,malloc() 缓冲区,然后 snprintf()
到该缓冲区。 (理论上你可以使用普通的 sprintf()
,因为长度现在已知,但我不会。)
无论如何,如果我的程序必须在过去制造的每个操作系统上运行,我不确定我是否会指望所有这些,但对于现在大多数人来说,这是一种合理的模式。
关于c - 将未知长度的格式化数据写入字符串(C编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1854353/