web-dev-qa-db-ja.com

Cの変数から文字列を構築する

私は、オペレーティングシステムクラスの提供により、ソケットを使用する必要最低限​​のブラックジャックゲームに取り組んでいます。すでに文字の配列をやり取りするソケットインターフェイスが提供されています。

私は期待していました私はこのようなことをすることができました:

char[] msgOut = printf("Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);

[〜#〜]ただし、[〜#〜]、グーグルすると、printfの戻り値がCharの出力の数のintであると判断しますnot charチャー自体の(私が望んだように)。

変数から文字列を作成できる別のC関数はありますか?

18
Raven Dreamer

printfは標準出力に書き込みます。 snprintfは、ここでの目的を達成します。補間された文字列は、snprintfの呼び出し後に「バッファ」に格納されます。バッファーサイズをもう少しインテリジェントに定義することもできますが、これは単なる例です。

char buffer[1024];
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2);
27
Ed S.

Glibc(および他のいくつかのCライブラリ)には、便利な関数 asprintf があります。

char *msgOut;
asprintf(&msgOut, "Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);
free(msgOut);

これは、文字列を保持するために必要なメモリ量の事前予測が不十分な場合に最も役立ちます。 (そうした場合、snprintfは動的にメモリを割り当てないため、オーバーヘッドが少なくなります。)

asprintfはないが、標準に準拠したsnprintfを使用するシステムでは、snprintfへの2回の呼び出しで実装できます。最初にバッファがなく、サイズがゼロで文字列の長さを決定します、介在するmalloc、次にその新しく割り当てられたスペースを使用して2回目。

8
ephemient

メモリを動的に割り当てるcの文字列ビルダーが必要な場合、私は http://linux.die.net/man/3/vasprintf が便利だと思いました。

例:

#include <stdio.h>

int i;
printf("//Simple dynamic string builder:\n");
char *strs[6] = {"I","am","an","array","of","strings"};

char *buf = "["; // open bracket
for (i=0;i<6;i++) {
    // Dynamically build and allocate memory
    asprintf(&buf,"%s%s",buf,strs[i]);
    if(i!=5) { // Add a comma , after each but skip the last
        asprintf(&buf,"%s,",buf);
    }
}
asprintf(&buf,"%s]",buf); // closing backet
printf("\"%s\"\n",buf);

出力は

//Simple string builder:
"[I,am,an,array,of,strings]"

そう char *bufasprintfによって動的に展開されており、asprintfステートメントにそれ自体をフォーマットすることによって構築しています。

0
frmdstryr