我正在使用 vsnprintf(据我所知),但结果很奇怪。我已将代码简化为以下示例:

void func(char *aaa, ...)
{
    char *buf;
    va_list args;
    int size;

    va_start(args, aaa);
    size = vsnprintf(NULL, 0, aaa, args)+1;
    buf = malloc(size);
    vsnprintf(buf, size, aaa, args);
    printf("%s",buf);
    free(buf);
    va_end(args);
}

int main(int argc, char **argv)
{
    func("abc %s", "def\n");
    return 0;
}

我希望打印“abc def”,但我得到的是“abc”,后跟一些垃圾文本。有谁知道我在哪里搞砸了?

最佳答案

va_start(args, aaa);
size = vsnprintf(NULL, 0, aaa, args)+1; // Reads all arguments
buf = malloc(size);
vsnprintf(buf, size, aaa, args); // Tries to read all arguments again
printf("%s",buf);
free(buf);
va_end(args);

请参阅注释行。您必须在使用所有参数的这两个调用之间重置 args

插:
va_end(args);
va_start(args, aaa);

关于c - vsnprintf 和 varargs 不工作,奇怪的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26835027/

10-12 01:27
查看更多