これは first または second の内容に関係なく機能するはずですか、それとも特別な考慮事項 (\0 またはその他で開始または終了する) が必要ですか?
文字列関数を使用しているため、これらは適切な C 文字列である必要があります。つまり、'\0'
文字で終了する必要があり、文字列に他の NUL を含めることはできません。
これらが実際に文字列ではなくバイナリ データである場合、strlen
や などの文字列関数は使用できませんsprintf
。これら2つの異なるケースに対して、2つの異なる回答を書くと思います。
ストリングス
これらが適切な NUL で終了する C 文字列である場合、次のようになります。
'\0'
文字のスペースを含めることを忘れないでください。
- へのキャスト
(u_char *)
は不要です。
- これでもコンパイルできますか?2 番目のパラメーターは、書き込む
snprintf
バイトサイズの数である必要があります。
u_char *
コンパイラは、ではなくを渡すことについても文句を言う必要がありchar *
ます。
これらすべてを考慮して、コードを次のように記述します。
size_t size = strlen(first) + strlen(second) + 1;
u_char *str = malloc(size);
if (str == NULL) {
/* handle error */
}
else {
snprintf((char *) str, size, "%s%s", first, second);
}
sprintf
実際には、文字列が常に収まることがわかっているため、この場合はより単純なものを選択できます。
sprintf((char *) str, "%s%s", first, second);
バイナリデータ
strlen
これらがバイナリ データの場合、 や などの文字列関数は使用できませんsprintf
。それらを回避するには、コードを書き直す必要があります。
バイト配列の長さを自動的に把握する方法はありません。それはあなたが自分自身を追跡しなければならない情報です。
size_t firstSize = /* ??? */;
size_t secondSize = /* ??? */;
u_char *newStorage = malloc(firstSize + secondSize);
memcpy
またはを使用して任意のバイトをコピーするにはmemmove
。
if (newStorage == NULL) {
/* handle error */
}
else {
memcpy(newStorage, first, firstSize);
memcpy(newStorage + firstSize, second, secondSize);
}