0

我不确定如何将不同的字符串类型传递给 C 中的函数。

我有一个接收格式化字符串的函数

void Logger::info(const char *logstring, ...) 
{

    // So I basically can write a preliminary message "DATA:" to a buffer
    // and then use vsnprintf() to write the const char *logstring to the buffer as well.

    int offset = 0;
    va_list argp;
    char buf[STRSIZE + 1];

    va_start(argp, logstring);
    offset = sprintf(buf, "DATA: ");
    vsnprintf(&buf[offset], STRSIZE - offset, logstring, argp);
    va_end(argp);

    // Then I write the buffer to stderr

    fprintf(stderr, "%s\n", buf);
}

我想做的是将所有这些更深入地移动到函数中。但我无法让它工作,因为我不知道如何成功地将格式化字符串“logstring”传递给函数并让它从另一边出来。

所以我想这样做......

info(const char *logstring, ...)
{
    writeToFile("Data:",logstring);
}

然后我可以更集中地完成日志文件的写入。

4

1 回答 1

1

好的,很可能我没有在这里找到您要寻找的地方,但愿意试一试并刻录答案。以下是尽可能基本的记录器,但演示了如何集中消息构建。底部包含一些测试条件,我特意缩小了初始缓冲区大小,以便您在调试器中浏览并以交互方式查看调整大小。毫无疑问,您会想放大它的大小。

无论如何,如果我碰巧碰巧并正确理解了这个问题,我希望如果它不能直接解决您的问题,您至少会得到一些想法。谢谢。

编辑: OP 要求使用 std::string 和缓冲区调整大小进行压制,以符合其嵌入式系统环境的有限编译能力。因此,使用了固定长度的缓冲区,并且vsnprintf()仅在内容实际适合时才信任来自的输出。

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

class Logger
{
    static const size_t STRSIZE = 256;

public:
    void error(const char* fmt, ...)
    {
        va_list argptr;
        va_start(argptr,fmt);
        log("ERROR", fmt, argptr);
    };

    // two different logging interfaces.
    void info(const char* fmt, ...)
    {
        va_list argptr;
        va_start(argptr,fmt);
        log("INFO", fmt, argptr);
    };

    void debug(const char* fmt, ...)
    {
        va_list argptr;
        va_start(argptr,fmt);
        log("DEBUG", fmt, argptr);
    };

private:
    void log(const char *msg, const char* fmt, va_list& vl)
    {
        // uses a fixed size message buffer
        char str[STRSIZE+1] = {0};
        strncpy(str, msg, sizeof(str)-1);
        strncat(str, ": ", (sizeof(str)-1) - strlen(str));

        // needed for sizing limits of variadic printf, then send
        //  output as a single line message to stderr.
        size_t mlen = strlen(str);
        if (vsnprintf(str + mlen, sizeof(str)-mlen-1, fmt, vl) >= 0)
            fprintf(stderr, "%s\n", str);
        else
            fprintf(stderr, "%s: (max log message length exceeded)\n", msg);
    };
};

int main(int argc, char *argv[])
{
    Logger logger;

    logger.debug("Numbers %d %d %d", 1,2,3);
    logger.error("Strings %s %s %s", "1", "2", "3");
    logger.info("Mixed %s %d %p", "1", 2, "3");
    logger.info("No additional parameters required for this message.");

    // demonstrate automatic cutoff.
    char sbig[] = "0123456789012345678901234567890123456789"
                  "0123456789012345678901234567890123456789";

    logger.debug("Oversized params: %d-%s %d-%s %d-%s %d-%s", 
                 1, sbig, 2, sbig, 3, sbig, 4, sbig);
    return 0;
}
于 2012-10-10T17:46:31.373 回答