2009-03-10 45 views
22

sがヌル終了していない場合、strlen(const char *s)が定義されていますか?そうであれば、何が返されますか?nullで終了しない文字列のstrlen()?

+8

自問してください: strlen()は、ヌル終了していない場合、文字列の終わりをどのように知るべきですか? – DevSolar

+1

技術的に言えば、NUL終止符はC文字列の一部であると定義されているため、NUL終止符ではないC文字列は存在しません:) – fredoverflow

答えて

30

いいえ、定義されていません。

+13

また、悪魔があなたの鼻を飛ばす原因にもなります。 http://catb.org/jargon/html/N/nasal-demons.html –

+2

これは私の痛む鼻孔を説明しています。 –

1

'\ 0'が見つかる前に遭遇した文字数を返します。これは、メモリアクセス違反となります。

+0

.......かどうか。 – alk

1

これは定義されていません。それは何かが起こる可能性がある、プログラムがクラッシュする可能性が高いことを意味する未定義の動作を引き起こします。

-2

常に定義されています。

"文字列"の長さがnullになったバイトに達するまで返します。これはバッファオーバーフローを引き起こす可能性があるため、悪い考えです。

+2

いいえ、定義されていません。 mallocまたはスタック/ヒープのいずれかを使用して、文字列に割り当てられた領域を超えて移動を開始すると、結果は厳密には定義されません。 –

9

C99標準から:

はstrlen関数はnull文字を終了 の前の文字の 数を返します。

結果が未定義であることを意味するヌル文字がない場合。

0

strlen()は、NULLで終了する文字列でのみ有効です(何か有用です)。それ以外のものを渡すと完全に定義されていない結果が得られます。運がよけれ場合は、クラッシュを引き起こすことはありません:)

+2

訂正、運が良ければクラッシュします。あなたはこのタイプのエラーが気付かれないようにしたくないでしょう:-P。 –

2

をあなたの文字列はNUL終了していない場合には、それが1つを見つけるまで、関数は探し続けるだろう。

あなたが運が良ければ、プログラムがクラッシュする可能性があります。

あなたが幸運でない場合、あなたはそれに「予想外」の値の多くで、戻って大きな予想以上の長さを取得します。

5

5月可能ですstrnlen

+5

残念ながら、これは標準Cの一部ではありません。 – joveha

0

男性3 strcspn

size_tのstrcspn(CONSTのchar * sで、CONSTのchar *拒否);

コロンで区切られた文字列の長さ:

size_t len = strcspn(str, ":"); 

カンマで区切られた文字列の長さ:

size_t len = strcspn(str, ","); 

タブ区切りの文字列の長さ:

size_t len = strcspn(str, "\t"); 
関連する問題