2

これは以前に尋ねられたであろう質問のようですが、私はそれを見つけることができませんでした. (もしそうなら、そこに私を指摘して、これを重複として閉じてください。)

私は次のように動作するCコードを持っています:

printf("some characters");
for (; n >= 0; n--)
{
    printf(", %s", f(n, k));
}
printf("more characters");

ここでは重要ではないいくつかの変数nk関数について。char* f(int n, int k)(nとは定数ではありません。) 上記のコードを、単純に表示するのではなく、kを返す関数に変換したいと思います。(最終的には印刷されますが、これによりリファクタリングが可能になり、もちろんその方法でテストするのが簡単になります。)もちろん、文字列を作成して文字ごとにコピーすることもできますが、確かにもっと良い(よりきれいな、より速く、より慣用的な)これを行う方法。char*printf

私の特定のアプリケーションfでは、 の親戚のような非常に単純な関数ですがitosk. しかし、将来他の人に役立つ可能性があるため、その場合に適したアイデアを歓迎します.

4

1 に答える 1

5

ステップ 1 は、文字列に十分な大きさのバッファーを割り当てることです。次にsprintf、バッファに出力するために使用します。標準的なイディオムは

int index = sprintf( buffer, "some characters" );
for (; n >= 0; n--)
{
    index += sprintf( &buffer[index], ", %s", f(n, k) );
}
index += sprintf( &buffer[index], "more characters" );

このsprintf関数は、書き込んだ文字列の長さを返します。これにより、バッファ内のどこにいるかを追跡できます。


呼び出し元にバッファとサイズを渡させることもできます。その場合、snprintfバッファのオーバーランを避けるために使用するのが最善です。したがって、関数は次のようになります

char *create_string( char *buffer, int size, int n, int k )
{
    ...
    index += snprintf( &buffer[index], size-index, ", %s", f(n, k) );
    ...
    return buffer;
}

ここで、sizeパラメータは のサイズですbuffer

于 2016-08-18T04:54:49.140 に答える