2011-02-03 30 views
13

私はオペレーティングシステムクラスの礼儀でソケットを使用するベアボーンブラックジャックのゲームに取り組んでいます。 すでに文字の配列を前後に渡すソケットインターフェイスが与えられました。もつともC言語の変数からの文字列を構築する

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

、printf関数の戻り値はシャア出力の数のint型であることを、ないかを決定するために私を導くグーグル:

私はが、私はこのような何かを行うことができを期待していました(私が望んでいた)charsのchar []。

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

答えて

23

printf標準出力に書き込みます。 snprintfはあなたがここで行っていることを達成します。補間された文字列は、snprintfを呼び出した後、 'buffer'に格納されます。あなたのバッファサイズをもっと知的に定義したいかもしれませんが、これは単なる例です。

char buffer[1024]; 
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2); 
+0

いいえ、例を見てください。バッファーはその場で変更されます。 C言語の多くの関数はエラーコードを返し、引数をその場で修正します。 Cで書かれたこのコードに慣れる必要があります。 –

+0

はい。私のところでは短絡している。私はそのコメントを書いた後、あなたの答えを瞬時に読んでいます。 –

+1

@EdS:どのように 'buffer'に追加しますか? 'buffer 'に' snprintf'を何度も呼び出そうとしていますが、 'buffer'の中のテキストを上書きしたくないとします。 – arunmoezhi

8

Glibc(およびいくつかの他のCライブラリ)は、便利機能asprintfを持っています。

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

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

が、標準に準拠しsnprintfで、それがsnprintfへの二つの呼び出しによって実装することができます - 最初のバッファなしで文字列の長さを決定するためのサイズがゼロであり、その間にはmallocが介在し、次にその新たに割り当てられたスペースを使用して2回目になります。

0

ダイナミックにメモリを割り当てる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ステートメントに自身をフォーマットすることによって構築されます。

+0

'asprintf'はGNU拡張であり、デファクトスタンダードのC/POSIXメソッドではないという事実に注目してください。 –

関連する問題