我有以下代码,以便从给定的参数列表构建一个字符串:
void MyLog
(
const char * formatPtr,
...
)
{
va_list args;
char buffer[BUFFER_LENGTH];
/* Initializing the buffer */
memset(buffer, NULL, BUFFER_LENGTH);
/* Formatting the arguments */
va_start(args, formatPtr);
vsprintf(buffer, formatPtr, args);
va_end(args);
/* Print arguments as a formatted string */
printf(buffer);
}
如果参数长度超过BUFFER_LENGTH
,则此代码容易出现缓冲区溢出。现在,我有一个约束,允许我只使用静态分配,如buffer[BUFFER_LENGTH]
中所示。
如何修改此代码以提供正确的解决方案,以提供包含格式化参数列表的空终止字符串,如果格式化的参数字符串长度超过BUFFER_LENGTH
,则生成的字符串将包含参数,直到最后一个适合BUFFER_LENGTH
最大长度的参数。
正确的解决方案是使用char* result = getFormattedString(formatPtr, args)
,但我不知道C库中存在这样的现有函数。
答案 0 :(得分:3)
示例中sprintf函数的使用不正确。你需要功能vsprintf。
函数vsnprintf是您正在寻找的函数,因为它有一个额外的参数来确定缓冲区的大小。