2012-04-23 17 views
0

これは初心者の質問です。フォーマットされたC文字列を作成するために、私は次のように、printf使用:フォーマットされた結果のC文字列を格納する方法

int n = 10; 
printf("My number is %i", 10); 

しかし、方法について:私は変数に結果のフォーマットされた文字列を格納することができますどのように

int n = 10 
char *msg = "My number is %i", 10; 
printf(msg); 

?私は "私の数は10です"と欲しいです。

答えて

12

(変数最初のMSGををmallocすることを忘れないでください):

int n = 10; 
char bla[32]; // Use an array which is large enough 
snprintf(bla, sizeof(bla), "My number is %i", n); 

Do not use sprintf(); snprintfと似ていますが、バッファサイズのチェックは行われませんので、セキュリティホールとみなされます。もちろん、十分なメモリを割り当てることができますが、ある時点でそれを忘れて大きなセキュリティホールを開く可能性があります。

あなたは機能があなたのためにメモリを割り当てるしたい場合は、代わりにasprintf()を使用することができます。

int n = 10; 
char *bla; 
asprintf(&bla, "My number is %i", n); 
// do something with bla 
free(bla); // release the memory allocated by asprintf. 
+0

元の投稿は、結果の所要期間(「結果の書式設定された文字列を変数に格納するにはどうすればよいか」)が不明であることに注意してください。 –

+4

'asprintf()'関数群(他のメンバーである 'vasprintf()')はどこでも利用できないことに注意してください。それらはLinux上で利用可能です。おそらくWindowsでは利用できません。 –

0

使用sprintf

int n=10 
char *msg ="My number is %i"; 
char bla[32]; // Use an array which is large enough 
sprintf(bla, msg, n); 
+3

を –

+0

を探していると思うけど、私が欲しい、I want only char * msg = "私の数字は10です"。 – Rodrigo

+0

OPSをMSGに割り当てる私は彼が 'sprintf' ... – Rodrigo

2

あなたはsprintf()を探しています。

int ret; 
int n=10; 
char msg[50]; /* allocate some space for string */ 

/* Creates string like printf, but stores in msg */ 
ret = sprintf(msg,"My number is %i",n); 
printf(msg); 
+0

私はあなたに彼に例を与えるべきだと思います... – Macmade

+1

@Pablo sprintf()は安全ではありません...:P – abhi

0

あなたはそれがこの のように基本的に使われています http://www.rohitab.com/discuss/topic/11505-sprintf-tutorial-in-c/

sprintfのようなものを使用する必要がありますあなたはsnprintf()を使用したい

char* msg; 
int ret = sprintf(msg,"My number is %i",10); 
printf(msg); 
+4

コピーしようとする前にポイントするために 'msg'にいくつかのメモリを割り当てることは良い考えですそこにデータ。さらに、 'snprintf'は危険ないとこにとってはいつも優先されるべきです。 –

+1

-1 'printf()'の最初の引数は常にリテラル形式の文字列(またはローカライズされた書式文字列、 'fmtcheck()'でチェックした文字列)でなければなりません。 %s "、msg)'。与えられた例は '%i'の出力がパーセントを持たないと仮定しても安全ですが、それは本当に悪いスタイルです。 –

関連する問題