3

char * rvを返す関数呼び出しの結果と連結しようとしていintます。fib()intを返します。私が遭遇している主な問題は、strcat()の署名にはconst char *2番目の引数としてのが必要なことです。

char * strcat ( char * destination, const char * source );

これが私のコードの小さなサンプルです。fib()n番目のフィボナッチ数を計算します-この場合、7番目のフィボナッチ数です。

char * rv;
int num;

rv = (char*)malloc(2048*sizeof(char));
num = 7;

...

strcat(rv, (const char *)itoa(fib(num), rv,10));

明らかにこれは間違っており、コンパイルされません。これを行う最もクリーンな方法は何ですか?を使用する代わりに、最初char * varの結果を保存するために別のものが必要ですか?itoa()rv

あなたが提供できるどんな助けにも感謝します!

4

4 に答える 4

3

snprintf()を含むバッファを構築し、intそれをバッファに連結するために使用しますrv。:への同じ呼び出しでの既存のコンテンツを連結しようとしないでください。rvsnprintf()

snprintf(rv, 2048, "%s%d", rv, itoa(fib(num), rv,10)));

これは、入力バッファと出力バッファがオーバーラップすることを意味しますが、これは未定義の動作です。

また:

したがって、malloc()呼び出しは次のようになります。

rv = malloc(2048);
if (rv)
{
}
于 2013-02-26T16:55:37.317 に答える
2

あなたはこれを行うことができます

sprintf(dest,"%s %d",rv,num);
于 2013-02-26T16:55:23.547 に答える
2

ingの前に数値を出力するための中間char配列が必要です。または、数値をstrcat直接に出力することもできますが、そのためには、末尾へのポインタが必要です。sprintfrv

char *rv = malloc(2048);
char *rv_end = rv;
...
rv_end += sprintf(rv_end, "%d", fib(num));

rv_endまた、バッファに他のものを追加するときにポインタを更新します。

(の戻り値を使用して改善してくれたjthillsprintfに感謝します。)

于 2013-02-26T16:58:25.667 に答える
1
char * strcat ( char * destination, const char * source );

ソースの「const」は、strcat関数が「source」を変更しないことをコンパイラに通知するだけです。さもないと、

strcat(buffer, "hi");

許可されません。

これは、ソースが一定でなければならないという意味でも、const修飾子が必要なわけでもありません。

strcat(rv, (char *)itoa(fib(num), rv,10));

(「const」なし)は完全に合法であり、コンパイラの警告を生成するべきではありません。

唯一の問題は、ソースの長さがわからない場合、バッファオーバーフローが発生する可能性があることです。この特定のケースでは、itoaリターンの長さを把握し、それに応じて宛先のサイズを設定できます。ただし、snprintfの方が、サイズを制御する方がおそらく安全です。

于 2013-02-26T20:01:44.293 に答える