私は、オペレーティングシステムクラスの提供により、ソケットを使用する必要最低限のブラックジャックゲームに取り組んでいます。すでに文字の配列をやり取りするソケットインターフェイスが提供されています。
私は期待していました私はこのようなことをすることができました:
char[] msgOut = printf("Dealer's Card is %C %C", char1, char2);
sendMsg(msgOut);
[〜#〜]ただし、[〜#〜]、グーグルすると、printfの戻り値がCharの出力の数のintであると判断しますnot charチャー自体の(私が望んだように)。
変数から文字列を作成できる別のC関数はありますか?
printf
は標準出力に書き込みます。 snprintf
は、ここでの目的を達成します。補間された文字列は、snprintfの呼び出し後に「バッファ」に格納されます。バッファーサイズをもう少しインテリジェントに定義することもできますが、これは単なる例です。
char buffer[1024];
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2);
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回目。
メモリを動的に割り当てる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 *buf
はasprintf
によって動的に展開されており、asprintf
ステートメントにそれ自体をフォーマットすることによって構築しています。