- 締切済み
charの初期化について
はじめて質問させていただきます。 よろしくお願いいたします。 eVC++の開発を行っています。 (今回の質問にはあまり関係ありませんが。。。) 関数内の宣言で、 char temp[] = {0x00, 0x01, 0x00}と初期化しておいて、 あとから、strlenをしてみると、lengthが0になってしまいます。 本来であれば、"3"が帰ってくると思うのですが。 基本的な質問で申し訳ありませんが、よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- V-bravo-U
- ベストアンサー率51% (155/301)
標準関数「strlen」は文字列の終端までの文字数を終端位置を含めない 文字数を返します。これは皆さんの回答されているとおりです。 で、sizeof(temp)とやると質問者の意図したとおりの「3」が 返ってきます。これもNo.1の方のおっしゃるとおりです。 じゃぁ、それぞれどのような挙動をするのかといえば、strlen(temp)は 「関数」なので&temp[0]を開始位置としてすぐ先にあらわれる '\0'のある位置までの差を返します。つまり、'\0'の位置が変わる ことでstrlen関数を通るたびに値は変動することになります。 (正にNo.3のおっしゃることそのまま) 一方sizeofはコンパイルした地点で値が決まっており、たとえ 直近の'\0'の位置が変わってもsizeof(temp)はコンパイル時点で 設定した「配列の大きさ×型サイズ」を返すことになります。 (これを言いたかっただけ(^^;) この違いを理解できたらプログラムの幅が広くなりますよ♪
- mitoneko
- ベストアンサー率58% (469/798)
Cにおける配列の大きさはコンパイラは管理してくれません。 文字列は単なる文字の配列ですからlengthはなにかで文字列の終リを判別する必要があります。 Cにおいては一般的にはnull(0x00)の文字を文字列の終リと解釈します。 今回の場合は最初の文字がnullですから文字列の長さは0ということになります。 Cの標準の文字列関数はすべてこのような動きをするので注意してください。
- emonky
- ベストアンサー率28% (18/63)
temp[] = {0x00, 0x01, 0x00} が文字列でないからだと思います。 temp[] = {0x30, 0x20, 0x30, '\0'} とすれば3となりますね
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 Cには久しく触ってないので間違ってるかも知れないですが・・・ stelenはデータの先頭から 0x00までの長さを計測します。 最初のデータが 0x00なので、結果は 0となります。 tempが使用しているサイズ(3byte)を取得したいのならば、 sizeofという関数が適切です。 sizeof(temp) = 3 となると思います。 参考になれば幸いです(..
お礼
みなみなさま、早々のご回答ありがとうございます! とても参考になりました。