おまけのコーナー 配列の中に格納されている🍋文字列🍋の文字数を数え上げるstrlen関数をつかって 配列の中に格納されている🍎数値🍎の数を数え上げてみよう

マックス

「ところで17次元配列まで完成させたが


一体


この17次元配列にはどれくらいの数の数値が格納されてるのか?


strlen関数で数え上げきれるかな・・」


てんC「そうですね。格納されている文字列の文字数でなく


数値の数ですか


配列に格納された文字列の文字数を数え上げるstrlen関数が


配列に格納された数値の数を数え上げるのに


はたして適用可能でしょうか?」


マックス「にゃはは~おもしろい、


てんC 俺らで


strlen関数がうまく配列に格納された数値の数をかぞえあげられるか?


適用範囲をしらべてみよ~じゃないか。」


てんC「はい(^^)、わかりました。」


マックス「うぉぉ、では、手始めに


実際に1次元配列に数値1を1文字だけ格納して


strlen関数をつかって数え上げる!!!


ちょこ、ちょこ」


ちょこ、ちょことプログラムを書き上げる。マックス。


#include <stdio.h>

int main(void)

{

char hairetu[]={1};

int a;

a=strlen(hairetu);

printf("hairetuに格納されている文字数は%dです \n",a);

return 0;

}


コンパイル結果

hairetuに格納されている文字数は4です


マックス 「配列に格納されている数値は1がひとつだけだが


strlen関数は格納されている数値の数は4とカウントしてきたか・・・」


てんC「???そうですね・・・うまく機能していないようですね。」


マックス「よっしゃ~~


もうすこし数値をふやし配列に1を2つ代入して


strlen関数で代入された数値の数を数え上げてみるぅぜぇぇぇ。


ちょこ、ちょこ」


ちょこ、ちょことプログラムを書き上げる。マックス。


#include <stdio.h>

int main(void)

{

char hairetu[]={1,1};

int a;

a=strlen(hairetu);

printf("hairetuに格納されている文字数は%dです \n",a);

return 0;

}

コンパイル結果

hairetuに格納されている文字数は5です


マックス「これは・・・もしや・・」


てんC「??良いデータがでてきましたね。」


マックス「おおっもしや、もしや


今度は


さらに数値をふやし配列に1を3つ代入し


strlen関数で代入された数値の数を数え上げてみるん。


しゃか、しゃか」


#include <stdio.h>

int main(void)

{

char hairetu[]={1,1,1};

int a;

a=strlen(hairetu);

printf("hairetuに格納されている文字数は%dです \n",a);

return 0;

}

コンパイル結果

hairetuに格納されている文字数は6です


マックス「なるほど


strlen関数は実際に配列内に格納されている数値の数プラス3を


表示してきているわけか・・・」


てんC「よい結果がえられましたね。


ところでマックスさん。


このchar型の配列 hairetuは普通は格納しているものが


aやbなどの文字(1バイトのデータ量)なのです


ですから


変数の型char型の配列

char hairetuによって生成される


char型の配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

でも確かに


(1バイトのデータをもつ)数値-127から数値128までは格納できますが


それより大きい整数値

(int型に格納されるようになりますので4バイトのデータ量をもちます)


例えば

char型の配列変数

hairetu[0]


に格納しようとすると

4バイトのデータ量をもつ整数値は

 

hairetu[0](1バイトのデータ格納容量)に入りきらないので


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]


の4つの配列変数


(1バイトのデータ格納容量×4=4バイトのデータ格納容量)にわたって格納されることになります。


数値1を格納したときは

hairetu[1]=1;


と1つの配列変数に格納され


数値512を格納したときは

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

の4つの配列変数に格納されるならば


数値を1つ格納したといっても


strlen関数は

数値1を格納した場合は

つまり


hairetu[1]=1;の場合は 格納した数値は1つだよ


数値512を格納した場合は

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

にわたって格納されたので


格納した数値は4つだよ


と数え上げる可能性があります。


これでは127を超える整数値を多数格納している


17次元配列に格納されている数値の数を


正確に数え上げることはできないと思われます。


そこで


そのような事態をさけるため


最初から


このプログラムの


配列の変数の型はcharでなく


変数の型intにすべきだと思われますが・・・」


マックス「なにぃぃ てんCにつっこみをいれられるとはぁぁ


はぁはぁ💖」


てんCの両手を握るマックス。


マックス 「おめでとう!」


てんC「は???い、いえ、どういたしまして」


マックス「というわけで


配列の変数の型charをintにかきかえてプログラムをコンパイルしてみると


配列に格納されている数値が1だけの場合


#include <stdio.h>

int main(void)

{

int hairetu[]={1};//変数の型charからintに変更しました

int a;

a=strlen(hairetu);

printf("hairetuに格納されている文字数は%dです \n",a);

return 0;

}


コンパイル結果

hairetuに格納されている文字数は1です


配列に格納されている数値が1、1と2つの場合


#include <stdio.h>

int main(void)

{

int hairetu[]={1,1};

int a;

a=strlen(hairetu);

printf("hairetuに格納されている文字数は%dです \n",a);

return 0;

}


コンパイル結果

hairetuに格納されている文字数は2です


配列に格納されている数値が1,1,1と3つの場合


#include <stdio.h>

int main(void)

{

int hairetu[]={1,1,1};

int a;

a=strlen(hairetu);

printf("hairetuに格納されている文字数は%dです \n",a);

return 0;

}


コンパイル結果

hairetuに格納されている文字数は3です


やったぜ!!てんC


きれいな結果がでてるじゃないか


お~いおいおい💦(🌊だ)(👈うれしさのあまり涙を誤変換しました)


お兄ちゃんはうれしいぞぉ


変数の型charをintにかきかえるだけで


配列内に格納された文字列の文字数を数え上げる


strlen関数を使って


ここまで


正確に配列内に格納された数値の数を数え上げることができるとは・・・


まったくおもわなかったぃ なははは」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます