char型の配列にひらがなの文字列を格納してみます そのときひらがなの文字列はchar型の配列内に生成された配列変数にどのように格納されているのでしょうか?

ソーラー「あの 全角文字のひらがなって


char型配列に格納することができるのかな?


だって


char型配列によって作られる


配列内の文字の入れ物


配列変数って


例えば

hairetuのchar型配列

char hairetu[3];

宣言によって作られる


char型の配列変数

hairetu[0]

hairetu[1]

hairetu[2]

となっているけど


この

hairetu[0]

hairetu[1]

hairetu[2]


はchar型なので1バイトまでしかデータを格納できないはずだよね


あんまり関係ないかもしれないけど


前のエピソードで次のような例があったよね。


#include <stdio.h>


int main(void){


char a='あ';

printf("%c\n",a);


return 0;

}

このプログラムをコンパイルすると


EAZY IDECの場合


コンパイルエラー


ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/ wwww/main.c」の

「5行目」で記述エラーを発見しました。

警告

multi-character character constant(複合文字定数)


(複合文字定数は


いろいろな文字が組み合わされた定数という意味です


つまり あ は1バイト文字でないという意味ですね)


と表示されます。


つまり1バイト文字でないものを' 'に格納しようとしていると


エラー文が表示されているわけです


Visual Studioの場合


ビルドでき

コマンドプロンプト画面に

が表示されます



警告 C4309 '初期化中': 定数値が切り捨てられました。

警告 C4305 '初期化中': 'int' から 'char' へ切り詰めます。 5


が表示されます。


("2バイト文字である'あ'から1バイト分だけデータをchar型に格納している"


ということを警告しています。


このことは後述されます。  

            

                solarplexussより)


このように なんか


ひらがなは


うまくchar型に格納できなかったよね」


アレサ 「そうでしたの。


それでは


実際に


char型の配列に


ひらがな ねこねこ の文字列を


格納してみましょう。ソーラーさん。😊


プログラムを以下のように構成してみました。


#include <stdio.h>


int main(void){


char hairetu[]="ねこねこ";


printf("%s\n", hairetu);


return 0;

}


アレサ「コンパイルっ」


コンパイル結果

ねこねこ


ソーラー「おおぅ ひらがなもchar型の配列に格納できてるね」


アレサ「ひらがなもchar型の配列に格納できるのですの


簡単でしたの。」


ソーラー「このとき


char型の配列変数宣言、初期化


char hairetu[]="ねこねこ";


によって生成される配列変数は


次のように


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


9つになるんじゃないかな?


ひらがな1文字は2バイト文字だから


ねこねこは合計8バイトのデータ量をもつことになる。


8バイトのデータ量を格納するには


1バイトのデータを格納できるchar型の配列変数が8つ


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]


いるはずだよね


それに


ねこねこを


まとまった1つの文字列とコンピュータに認識させるのに


ヌル文字\0



hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

に格納された


ねこねこにつづいて


char型の配列変数

hairetu[8]

に格納させる必要があるので



文字列 ねこねこ を配列に格納するには


合計9個のchar型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


が必要になると思うんだ。


さて


どのようにひらがなの文字列


ねこねこ



これらの


配列変数に格納されているのかな?


1バイト文字ずつしか

char型の配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


には格納できないよね。


2バイト文字のひらがなをどうやって格納しているのかな?


🌞

ソーラーはねこねこのデータ量


8バイト


それにねこねこのあとに


ねこねこを文字列とするためにつけられるヌル文字\0のデータ量


1バイト


合計9バイト


をchar型配列に格納しようとしているので


char型配列には


文字を格納するいれものが9バイト分


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


の9つ用意されると予想しています


🌞


アレサ「それでは


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


にどのようにひらがなのデータが格納されているか


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]

に格納されているデータを


直接


%c出力変換指定子を使いprintf出力表示してみますの。


プログラムを以下のように構成しました。


文字列かくかくをchar型の配列に格納しています。」


#include <stdio.h>


int main(void){


char hairetu[]="かくかく";


printf("%c\n", hairetu[0]);

printf("%c\n", hairetu[1]);

printf("%c\n", hairetu[2]);

printf("%c\n", hairetu[3]);

printf("%c\n", hairetu[4]);

printf("%c\n", hairetu[5]);

printf("%c\n", hairetu[6]);

printf("%c\n", hairetu[7]);

printf("%c\n", hairetu[8]);

printf("%c\n", hairetu[9]);


return 0;

}


ソーラー「それでは コンパイルすると・・・」



コンパイル結果


続行するには何かキーを押してください . . ._



ソーラー


〘か〙 が




〘く〙 が


にあたるのかな?


コンパイル結果の

〘ュ〙

〘続行するには何かキーを押してください . . ._〙


の間が空白スペースになっているのは


\0がprintf出力表示されると


空白が表示されるからだね。」


アレサ「


ひらがな か の画像データ情報がメモリ内で


次のように2バイト(16ビット)


0100101010101010で表されているとすると


char hairetu[]="かくかく";

によって生成されるデータのいれもの


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


まずは

char hairetu[0]に


0100101010101010の右から8ビット分(1バイト分)の


10101010が収められ


その次に


char hairetu[1]に


0100101010101010の左から8ビット分(1バイト分)の


01001010がおさめられているとおもわれますの。


つまり

画像データ か の

データ情報が

2バイトの情報量をもっていたとしても


メモリに格納されるとき


char hairetu[0]

char hairetu[1]


に1バイトずつに分割して


格納されているのではないでしょうか?


char hairetu[0]だけに か を格納しなくてもよいわけですね。


1バイトしか格納容量のないchar型 の変数a


に ひらがな か を格納するときとは違い


このように ひらがな か も


配列charの配列変数に分割して


格納することができるわけです。


そして


char hairetu[0]に01001010

char hairetu[1]に10101010


と分割して格納されたデータを


それぞれ%c出力変換指定子をつかって


printf("%c\n", hairetu[0]);

printf("%c\n", hairetu[1]);


とprintf出力表示すると


01001010

10101010

に対応した画像データ


が表示されるのではないでしょうか?」


ソーラー「そんな感じがするね😊」


アレサ「もう1つ


ひらがなの文字列 るんるんは どのように


char型の配列変数宣言


char hairetu[]="るんるん";


によって生成される配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

hairetu[5]

hairetu[6]

hairetu[7]

hairetu[8]


に格納されているか試してみます。


以下のようにプログラムを構成して


#include <stdio.h>


int main(void){


char hairetu[]="るんるん";


printf("%c\n", hairetu[0]);

printf("%c\n", hairetu[1]);

printf("%c\n", hairetu[2]);

printf("%c\n", hairetu[3]);

printf("%c\n", hairetu[4]);

printf("%c\n", hairetu[5]);

printf("%c\n", hairetu[6]);

printf("%c\n", hairetu[7]);

printf("%c\n", hairetu[8]);

printf("%c\n", hairetu[9]);


return 0;

}


ソーラー「コンパイルすると・・」



コンパイル結果


ソーラー「??どうなってるのかな これ?」


アレサ「おそらく画像データ る の


データ情報が


1001101010101101(2バイト)で表現されていると


すると


そのままでは


1バイトしかデータ容量をもたないchar型の配列変数には


格納できないので


char hairetu[0]に1001101010101101の右から1バイト(8ビット)分の10101101


を格納


char hairetu[1]に1001101010101101の左から1バイト(8ビット)分の10011010


を格納


という具合に


1バイトずつ分割して

格納しているのではないでしょうか?


そして

printf("%c\n", hairetu[0]);

printf("%c\n", hairetu[1]);


を実行するとコンパイル結果が


同じ記号

が表示されていますね。


char hairetu[0]

char hairetu[1]に


格納されている数値は


10011010

10101101


とそれぞれ違うのに


同じ記号・が表示されるのは


ある数値データには半角英数字などの記号が割り当てられていますが


それ以外の数値


この場合の


10011010

10101101


のようなものには

すべて

が割り当てられているからでないでしょうか


ソーラーさん😊」


ソーラー「おぉっ そうかもしれないね


トレビアーンだね」


まだまだ💖


このお話は仮説の段階となっています。


                solarplexussより



そのころ・・・


晴れ晴れとした青空のもと




マックス「よ~し よし


かわいい😺ちゃんや」


緑の芝生で猫と戯れるマックス。


にゃんこ「にゃ~」


マックス「お~かわいいなぁ💖」



    ◇   ◇   ◇


ソーラー「そうだね。よ~し そうだ。


こうなったら


アレサ


char型の配列にるんるんが


どのように格納されているか


僕らも配列の世界へいって遊んでみよう。」


アレサ「はい、ですの」


ソーラー「まずは準備開始だね。


こねこねこね


こねこねこね

こねこねこね


アレサ はちみつはあったかな?」


アレサ「いま おもちいたしますの」


ソーラー「ちょっと味見をしてみよっかな」


生成されたマナはきらきらと輝いている。


アレサ「おいしい(´▽`*)


これは なんですの」


ソーラー「これはね マナとよばれる


エネルギーみたいなものかな」


アレサ「精霊さんたちもどうぞ」


さんさんと

精霊があつまってくる

「みゃお~ん」


ソーラー「これから行くところでは


かなり遊べそうだね


そのためにも


腹ごしらえはしっかりしとかないとねぇ」


アレサ「どんな世界になってるのかな?」


ソーラー「それでは😊・・・」


転送先へとイメージで照準をあわせる。



ソーラー「それでは(´▽`*)


char型の配列にるんるんが格納されている


その世界へ

いざ


るんるん・・・


るんるん(^^♪


る!ん!る!ん!


きたきたぁ 転送!」



ばみゅんっ



マックス「!!みゃお~!!?」

ねこ「びくぅっ」

とびのく🐈ねこ


ソーラー「あ❕・・・」


アレサ「あ‼・・・」


ソーラー「なんか声が・・・」


アレサ「しってる人っぽかった・・・」


ソーラー「(*´▽`*)・・・・・・」

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

作者を応援しよう!

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

応援したユーザー

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