2016-12-04 4 views
3

ファイルに印刷するために必要なMPIプロセスがあります。 MPIシステムは、MPI_File_iwriteのような機能コマンドを使用します。このコマンドは、バッファ(例えば、charポインタ)と整数長を受け入れます。次に、バッファがファイルに印刷されます。Cでprintf文が与えられた場合、char *バッファをどのように構築し、その長さを知ることができますか?

ファイルに印刷する必要があるものを印刷するために、printf関数を、書式変換をchar *バッファにマップする関数で置き換える必要があります。

printf("something %d, %d, %d, %f, etc.",x,y,z,p,d,...); 

を私はprintfの書式が生成する文字列を回復するにはどうすればよい、長さが何であるかを把握し、へのchar *として渡す:文字列は、例えば...長さを変えることができるので、これは、問題がありますmpi関数?

+0

1) 'printf'は関数であり、文ではありません。 2) 'printf'は文字列を生成しません(' char [] ')。' char * 'は' char'へのポインタであり、配列ではありません。 – Olaf

+0

'printf()'が 'printf("%c "、0);'のようなことをし、 's(n)printf(some_buffer、...);を使用しようとすると、 len = strlen(some_buffer); 'は正しい文字数を出力しません。 'snprintf()'の戻り値を使うのがベストです。 – chux

答えて

7

十分に大きなバッファにsnprintfを使用するようです。

バッファが十分に大きければ、戻り値snprintfは印刷された文字数に等しい。出力文字列の長さは、バッファーの最小サイズと戻り値snprintfとして計算できます。バッファにsprintf()出力と渡されたバッファが十分な大きさであることを任意のチェックせずに書かれた文字の数を返します -

+1

ありがとうございます(まだ数ヶ月間Cで) – bordeo

+1

答えとして質問に印を付けてください。 –

+0

'strlen()'を使う必要はありません。 'snprintf()'は与えられたはずの文字数を示します。指定した文字数が小さすぎると、出力が切り捨てられます。 –

3

は、あなたの質問に基づいて、私は答えはsprintf()またはsnprintf()ではなく、printf()を使用することだと思います。 snprintf()は、書き込む最大バイト数を指定する追加の引数をとります(より安全なアプローチです)。

char my_buf[MAX_LENGTH]; 
int bytes_written; 

// using snprintf 
bytes_written = snprintf(my_buf, MAX_LENGTH, "%d %d ...", arg0, arg1 ...); 

sprintf()こととバリアントもので、これはあなたの定義されたバッファサイズに反映されるべき終端文字\0のための追加のバイトが必要です。戻り値(書き込まれたバイト数)にはターミネータ文字は含まれません。

+2

全体としては、 'sprintf()'とその親戚の存在を忘れることが最善です。バッファオーバーフローからあなたを守るので、実際には 'snprintf()'だけを使うべきです。つまり、あなたのバッファが十分に大きく、出力データが十分に小さいという確信があるなら、 'sprintf()'はまだ使えますが、 'snprintf()'を強調して 'sprintf()'捨てられたコメントで。 –

5

snprintf()NULLポインタに0バイトを「印刷」することができます。この場合、文字列は書き込まれませんが、snprintf()は戻り値に対して正常に動作します。次に、十分な大きさのバッファを割り当てることができます。例えば

size_t len; 
len = snprintf(NULL, 0, "something %d, %d, %d, %f, etc.",x,y,z,p,d,...); 
char *buf = malloc(len + 1); 
snprintf(buf, len + 1, "something %d, %d, %d, %f, etc.",x,y,z,p,d,...); 

これはC99でのみ有効であり、さらに。

+1

このコードのユーザは、メモリリークを防ぐために 'buf'が不要になった後に' buf'で 'free()'を呼び出すことを忘れないでください。 – theorifice

+0

注: 'snprintf()'は 'int'を返します。負の戻り値はエラーを示します。 – chux

+0

*出力*エラー。 'snprintf()'が処理できる検出可能な出力エラーはありますか? – giusti

関連する問題