2

snprintf()次の変換を指定された回数繰り返すための追加の書式指定子など、いくつかの追加機能を備えたバージョンを作成する最も簡単な方法は何ですか? たとえば、パラメーター リスト内のパラメーター%6a%-3xを受け入れるようなものがあり、これが文字列をchar*指している場合は. 関連付けられたパラメーターは常に、適切な型の配列へのポインターになります。"My test string""4d 79 20 74 65 73 74 "

車輪の再発明を避けるために、私が助けてほしいのは、フォーマット指定子と可変長パラメーターリスト (フォーマット文字列のフォーマット指定子に依存する型) を解釈するコードです。

これは、PIC 用に Microchip の C30 コンパイラを使用してコンパイルする必要があるため、単純な昔ながらの C である必要があります。

ありがとう - ローワン

4

2 に答える 2

2

vsprintfはあなたが探しているものです。可変数の引数を取り、呼び出しを行う前に必要なことを実行できる独自の sprintf のような関数を作成できます。

これを使用して、組み込みデバイスの USB エンドポイントに独自の printf を実装した例を次に示します。

#include <stdarg.h>
void uprintf(char *fmt, ...) {
    va_list args;
    va_start(args, fmt);
    vsprintf(str_buffer, fmt, args);
    usb_write(str_buffer);
    va_end(args);
}

あなたの場合、呼び出しの前にフォーマット文字列を「インターセプト」しvsprintf、独自の構文を適切なフォーマット指定子構文に展開してから、新しいフォーマット指定子と変数 arg リストを に渡すことができますvsprintf

void your_printf(char *fmt, ...) {
    char new_fmt_string[1024];  /* make sure you allocate enough space */
    va_list args;

    /* here, do your transformation on the fmt string */

    va_start(args, new_fmt_string);
    vsprintf(str_buffer, new_fmt_string, args);

    /* now take your fully formatted string and do something with it */

    /* then clean up */
    va_end(args);
}
于 2012-07-03T00:11:20.333 に答える
1

最も簡単な方法は、あなたが望む答えではないかもしれませんが、おそらく最も実用的な解決策です: 実行しないでください。

代わりに、バッファに書き込む独自の出力関数を作成してください。

// print count bytes from buf into s, but take up no more than n-1 bytes
// returns how many bytes were (or would be) printed
int snprint_hex (char *s, size_t n, const char *buf, size_t count) {
    //...
}

コードがより明確になり、すべてのprintf形式指定子を処理するために難解な解析コードを実装する必要がなくなります。

于 2012-07-03T00:16:09.087 に答える