7

私は以下のコードを使用しています

char call[64] = {'\0'} /* clean buffer */
strncpy(call, info.called, sizeof(call));

ソースが宛先よりも大きい場合に備えて、オーバーフローを保護するために、常に宛先にsizeofを使用します。このようにして、宛先が処理できる量だけコピーするため、バッファオーバーフローを防ぐことができます。

しかし、私は今、それが宛先をヌル終了するかどうか疑問に思っています。

いくつかのケース。

1)ソースが大きい場合。私はこれを行うことができます:

call[strlen(call) - 1] = '\0'; /* insert a null at the last element.*/

2)送信元が宛先よりも小さい場合。呼び出しは64バイトで、ソースのサイズである50バイトをコピーします。51要素に自動的にnullを入れますか?

情報をありがとう、

4

7 に答える 7

15

strncpy文字列を切り捨てた場合、宛先はnullで終了しません。を使用strncpyする必要がある場合は、次のように結果が終了していることを確認する必要があります。

strncpy(call, info.called, sizeof(call) - 1);
call[sizeof(call) - 1] = '\0';

BSDstrlcpy()は、とりわけ、一般的に優れていると考えられています。

http://www.openbsd.org/cgi-bin/man.cgi?query=strlcpy

于 2009-07-24T10:03:01.097 に答える
7

ソースの長さが3番目のパラメータとして渡された最大数よりも短い場合、strncpyは宛先をnullで終了します。それ以外の場合は、そうではありません。

ソースの長さがデスティネーションと同じかそれ以上の場合、それを処理するのはあなたの問題です。あなたが提案するように-strlen()を呼び出す-バッファはnullで終了せず、未定義の動作に遭遇するため、機能しません。

より大きなバッファーを割り当てることができます。

char buffer[bufferSize + 1];
strncpy( buffer, source, bufferSize );
*(buffer + bufferSize ) = 0;
于 2009-07-24T10:02:46.543 に答える
4

あなたの案:

call[strlen(call) - 1] = '\0';

strlen()終了していない文字列を呼び出すため、機能しません

于 2009-07-24T10:01:33.610 に答える
1

しかし、私は今、それが宛先をヌル終了するかどうか疑問に思っています。

いいえ、strncpyは、ターゲット文字列がnullで終了することを約束していません。

char tar[2]={0,0};
char bar="AB";
strncpy(tar,bar,2);
// result tar[0]=='A'; tar[1]=='B'

それを正しくするためにあなたが使うべきです:

strncpy(traget,string,sizeof(target)-1);
target[sizeof(target)-1]=0
于 2009-07-24T10:03:57.867 に答える
1

strncpy() の代わりに strlcpy() を使用してください。すべてのプラットフォームで利用できるかどうかを確認する必要があります。Linux の初期のバージョンには、おそらくそれがありません。

于 2014-05-26T00:44:56.687 に答える
1

1) cplusplus.com より: 「宛先の最後に null 文字が暗黙的に追加されることはないため、ソースの C 文字列の長さが num 未満の場合にのみ、宛先は null で終了します。」したがって、文字列をヌルで終了する必要がある場合は、次のようにする必要があります。

call[sizeof(call) - 1] = '\0';

これを行う良い方法はstrncpy、文字列が常に終了していることを確認するためのラッパー関数を作成することです。

2) ソースがデスティネーションより短い場合、デスティネーションは null で終了します。

于 2009-07-24T10:04:15.010 に答える