1

私が書いた場合:

char  lili [3];
cout<<strlen(lili)<<endl;

次に、印刷されるのは:11

しかし、私が書く場合:

char  lili [3];
lili [3]='\0';
cout<<strlen(lili)<<endl;

それから私は3を取得します。

なぜ最初の部分で11が返されるのかわかりませんか?
strlenは3文字を割り当てたので、3を返すことになっているのではないliliですか?

4

4 に答える 4

8

これはstrlen、「Cスタイル」のnullで終了する文字列で機能するためです。最初の例で行ったように、プレーンポインタまたは初期化されていないバッファを指定すると、a)が見つかるまでメモリを移動し続け、\0その時点でその「文字列」の長さを返すか、b)それまで保護されたメモリ位置に到達し、エラーを生成します。

このC++にタグを付けたことを考えると、おそらく、を使用することを検討する必要がstd::arrayありstd::stringます。どちらも長さを返す関数(size())を提供し、ここで行っているようにコードが初期化されていないメモリ領域に移動するのを防ぐのに役立ついくつかの追加の範囲チェックロジックを備えています。

于 2012-06-27T08:55:52.900 に答える
5

このstrlen関数は、に設定されたバイトを検索します\0。初期化されていない配列で実行すると、動作は未定義になります。

于 2012-06-27T08:55:24.100 に答える
2

最初にアレイを初期化する必要があります。それ以外の場合は、ランダムなデータが含まれています。

strlenは文字列終了記号を探しており、それが見つかるまでカウントします。

于 2012-06-27T08:54:54.133 に答える
2

strlenは、「\ 0」(「文字列の終わり」を意味します)に達するまでの文字数を計算します。CおよびC++では、char[]はchar*と同等であり、strlenはlilicharへのポインタとして使用し、終了する'\0'に到達するまでそれが指すメモリを繰り返します。たまたま、アレイに割り当てられたメモリから11バイトのメモリに0バイトがありました。あなたはもっと奇妙な結果を得ることができたでしょう。

実際、lili [3] ='\ 0'と書くと、配列外のメモリにアクセスします。C / C ++での3要素配列の有効なインデックスは0〜2です。

于 2012-06-27T09:04:44.610 に答える