根据给定格式和未知数量的参数构建字符串

时间:2016-09-20 08:25:53

标签: c arguments printf

我有以下代码,以便从给定的参数列表构建一个字符串:

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库中存在这样的现有函数。

1 个答案:

答案 0 :(得分:3)

示例中sprintf函数的使用不正确。你需要功能vsprintf。

函数vsnprintf是您正在寻找的函数,因为它有一个额外的参数来确定缓冲区的大小。