可变函数包装器

时间:2017-08-28 17:03:31

标签: c++ printf variadic-functions

根据我的阅读,这个函数应该有效,但对于我的生活,我无法弄清楚为什么它不是。

我覆盖了无效参数处理程序,因此如果传递了无效参数(例如缓冲区太小),我可以继续运行。  asprintf_s宏获取标准sprintf_s的参数,添加文件名和行号,然后调用asprintf_s2。它会检查结果是否溢出缓冲区,打印文件名以及溢出发生的位置。

问题:我猜测我对可变参数做错了,因为 始终 会返回溢出。

Output of program below

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <string>
#include <excpt.h>
#include <stdarg.h>


#define asprintf_s(...) asprintf_s2( __FILE__, __LINE__, __VA_ARGS__) 
//#define asprintf_s(...) sprintf_s( __VA_ARGS__ )

inline int asprintf_s2(char *file, int line, char *dest, int sizeOfDest, char *Format, ...)
{
    va_list pArgs;
    va_start(pArgs, Format);

    int sizeOfBuffer = sprintf_s(dest, sizeOfDest, Format, pArgs);

    if (sizeOfBuffer == -1) printf("Buffer Overflow! File: %s LINE: %d\n", file, line );

    va_end(pArgs);

    return sizeOfBuffer;
}


void in_house_invalid_parameter(
    const wchar_t * expression,
    const wchar_t * function,
    const wchar_t * file,
    unsigned int line,
    uintptr_t pReserved
)
{
    // Do nothing on invalid parameter
}



int main()
{
    char temp1[3];
    char temp80[80];
    std::string input;
    int k = -3;

    _set_invalid_parameter_handler(in_house_invalid_parameter);

    strcpy_s(temp1, sizeof(temp1), "XX");
    strcpy_s(temp80, sizeof(temp80), "1");

    printf("Temp1:'%s'\n", temp1);

    k = asprintf_s(temp1, sizeof(temp1), "%s\n", temp80);

    printf("k:%d   temp1:'%s', temp80:'%s'\n", k, temp1, temp80);
    std::getline(std::cin, input);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您只需使用vsprintfvsprintf_s功能

即可

为您的案例编辑:或vasprintf