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 に答える