1. ホーム
  2. c

[解決済み] C言語のフォーマット文字列を作成する(印刷はしない)

2022-07-12 15:44:40

質問

文字列を受け取る関数があります。

void log_out(char *);

のように、呼び出す際に、その場で整形された文字列を作成する必要がありますね。

int i = 1;
log_out("some text %d", i);

ANSI Cでこれを行うにはどうしたらよいでしょうか?


のみです。 sprintf() はintを返すので、少なくとも3つのコマンドを書かなければならないことになります。

char *s;
sprintf(s, "%d\t%d", ix, iy);
log_out(s);

これを短くする方法はありますか?

どのように解決するのですか?

使用方法 sprintf . (これは安全ではありませんが、OPはANSI Cの答えを要求しています。安全なバージョンについてはコメントを参照してください)。

int sprintf ( char * str, const char * format, ... );

フォーマットされたデータを文字列に書き込む printfでformatが使われた場合に出力されるのと同じテキストで文字列を構成する。 ただし、printfでformatが使用された場合は印刷されるのではなく C言語の文字列としてstrが指すバッファに格納されます。 に格納されます。

バッファのサイズは、結果の文字列全体を含むのに十分な大きさであるべきです。 を含むのに十分な大きさでなければなりません(より安全なバージョンについては、snprintfを参照してください)。

の後に、終端ヌル文字が自動的に付加されます。 の後に自動的に付加されます。

formatパラメータの後、この関数ではフォーマットに必要な数だけの の追加引数が必要です。

パラメータです。

str

結果のC文字列が格納されるバッファへのポインタ。このバッファは は、結果の文字列を格納するのに十分な大きさでなければなりません。

format

<ブロッククオート

printfのformatと同じ仕様のフォーマット文字列を含むC文字列(詳細はprintfを参照)。 の仕様に従った書式文字列を含むC言語文字列です(詳細はprintfを参照)。

... (additional arguments)

<ブロッククオート

フォーマット文字列によっては、この関数は一連の を置き換えるために使用される値を含む追加の引数の列を期待することができます。 フォーマット文字列のフォーマット指定子を置き換えるために使用される値(または、ストレージの へのポインタ)を含む。これらの引数は,少なくとも の数は,少なくとも書式指定子で指定された値の数と同じでなければならない。追加の の引数は関数では無視されます。

例を示します。

// Allocates storage
char *hello_world = (char*)malloc(13 * sizeof(char));
// Prints "Hello world!" on hello_world
sprintf(hello_world, "%s %s!", "Hello", "world");