从自定义printf函数返回一个const char*

Bla*_*pel 4 c c++ printf variadic-functions

我写了一个自定义打印功能.我的问题是我需要返回一个,const char*因为这必须在另一个函数中使用.我根本不知道如何管理......

anotherFunction (const char* text /*Here*/, unsigned __int32 value, unsigned __int64 bigVal);

我知道以下示例/ s不能正常工作.这就是我到目前为止所尝试过的.

const char* CatchMessage (const char *message, ...)
{
    va_list  args;
    va_start (args, message);
    /*?*/
    va_end   (args);
    return message;
}
Run Code Online (Sandbox Code Playgroud)

我只是设法在cmd中获得正确的输出,但实际上我需要它作为返回值.

void CatchMessage (const char *message, ...)
{
    va_list  args;
    va_start (args, message);
    vfprintf (stdout, message, args);
    va_end   (args);
}
Run Code Online (Sandbox Code Playgroud)

呼叫:

CatchMessage ("Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
Run Code Online (Sandbox Code Playgroud)

应该返回:

"Some Input stuff and 12 equals to 6"
Run Code Online (Sandbox Code Playgroud)

我一直无法找到解决方案.任何帮助,将不胜感激.

问:如何让此CatchMessage函数返回格式正确的const char*

NPE*_*NPE 6

听起来CatchMessage应该是一个指向char缓冲区(及其大小)的指针,并vsnprintf()进入该缓冲区.


glg*_*lgl 2

const返回 ( )的问题char *是你必须在某个地方有一个缓冲区。

有几种方法可以实现此目的:

  1. 调用者必须提供该缓冲区
  2. 你必须malloc()这样做
  3. 该函数本身作为static缓冲区,但这将使其不可重入 - 这对多线程等不利。

广告1:

void CatchMessage(char * result, size_t maxlen, const char *message, ...)
{
    va_list ap;
    va_start(ap, message);
    vsnprintf(result, maxlen, message, ap);
    va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

打电话给

char buffer[500];
CatchMessage(buffer, sizeof buffer, "Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
anotherfunction(buffer, ...)
Run Code Online (Sandbox Code Playgroud)

广告2:

char * CatchMessage(const char *message, ...)
{
    size_t size = 500;
    char * result = malloc(size);
    if (!result) return NULL; // error handling!
    while (1) {
        va_list ap;
        va_start(ap, message);
        size_t used = vsnprintf(result, size, message, ap);
        va_end(ap);
        char * newptr = realloc(result, size);
        if (!newptr) { // error
            free(result);
            return NULL;
        }
        result = newptr;
        if (used <= size) break;
        size = used;
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

打电话给

char * buffer = CatchMessage(buffer, sizeof buffer, "Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
if (!buffer) { /* error handling: no memory! */ }
anotherfunction(buffer, ...)
free(buffer); // important for avoiding memory leaks
Run Code Online (Sandbox Code Playgroud)

广告 3:

char * CatchMessage(const char *message, ...)
{

    static char result[500]; // static is important here! Otherwise the memory will be freed immediately after returning.
    va_list ap;
    va_start(ap, message);
    vsnprintf(result, sizeof result, message, ap);
    va_end(ap);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

打电话给

char * buffer = CatchMessage(buffer, sizeof buffer, "Some Input %s and %d equals to %d", randString, randNumber, secRandNumber);
anotherfunction(buffer, ...)
Run Code Online (Sandbox Code Playgroud)

没有其他选择,尤其是不定义

char result[500];
Run Code Online (Sandbox Code Playgroud)

在函数中然后返回它:该数组位于堆栈中,并在返回后立即释放。调用者无法安全地访问它;它的内容只是未定义。