1

malloc で作成された配列 u_char * があり、文字列を保持しています。実際には、文字列の長さよりも大きくなります。

snprintf() を使用して、別の配列をこれの先頭に追加し、別の配列に格納したいと考えています。

だから私はこのようなものを持っています

u_char * newstorage = (u_char *)malloc(strlen(first) + strlen(second));
snprintf(newstorage, "%s%s", first, second);

これは first または second の内容に関係なく機能する必要がありますか、それとも特別な考慮事項 (\0 または何かで開始または終了する) が必要ですか?

first と second は両方とも動的に割り当てられた u_char 配列です。

問題は、最後の newstorage が完全な文字列を保持していないように見えることです。first または second のいずれかに、文字列の途中などに間違った \0 が含まれている場合、問題はありますか? (私はそれらを制御できないため、非常に可能性があります)。

4

3 に答える 3

3

を割り当てる必要がありstrlen(first) + strlen(second) + 1ます。

first または second のいずれかに、文字列の途中などに誤った \0 が含まれている場合

次に、それらはC文字列ではなく、それらのような文字列関数を使用するビジネスはありませんstrlen. memcpyの代わりに使用する必要がありsnprintfます。

于 2013-01-30T23:46:05.830 に答える
1

これは first または second の内容に関係なく機能するはずですか、それとも特別な考慮事項 (\0 またはその他で開始または終了する) が必要ですか?

文字列関数を使用しているため、これらは適切な C 文字列である必要があります。つまり、'\0'文字で終了する必要があり、文字列に他の NUL を含めることはできません。

これらが実際に文字列ではなくバイナリ データである場合、strlenや などの文字列関数は使用できませんsprintf。これら2つの異なるケースに対して、2つの異なる回答を書くと思います。

ストリングス

これらが適切な NUL で終了する C 文字列である場合、次のようになります。

  1. '\0'文字のスペースを含めることを忘れないでください。
  2. へのキャスト(u_char *)は不要です。
  3. これでもコンパイルできますか?2 番目のパラメーターは、書き込むsnprintfバイトサイズの数である必要があります。
  4. 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);
}
于 2013-01-30T23:48:43.130 に答える
0

これには多くの方法がありますが、これはその 1 つです。あなたの場合の問題は、新しく割り当てられた配列で終端の NULL のためのスペースを許可していないことです。

この方法で使用snprintfするのは非効率的です。それが問題になるかどうかはわかりません。新しい配列を均等に割り当てて、配列strcpyを連結するために使用できます。

于 2013-01-30T23:47:56.490 に答える