char型の配列に文字列nekoを格納しnekoをコマンドプロンプト画面にprintf出力表示してみよう

アレサ

「今まで


1文字ずつ文字を配列内に生成された配列変数にとりこんできました。


そして


配列変数に格納された1文字を


printf関数を使いコマンドプロンプト画面に


printf出力表示してきました


#include <stdio.h>


int main(void)

{

char hairetu[ ]={'n','e','k','o'};


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

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

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

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


return 0;

}

コンパイル結果

n

e

k

o



1文字ずつ文字を配列に格納して


printf出力表示できるなら


1文字だけでなく

文字列neko, tumbalin,suika,

などを

配列に格納し

printf出力表示してみたくなるのが人情・・・


なのです・・・」



ソーラー 「そうだよね。


1文字だけ


n


を配列変数hairetu[0]


に取り込んで


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

を実行し


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


n

printf出力表示していたら


観衆には受けるかもしれないけど


neko^^daisuki-clispy!


のような文字列を一挙に配列にとりこんで


printf表示できたら痛快だね。


そんな風に


ゲームのテキスト画面に文字列をさらさら表示した~いんだ


そこで


配列をつかって


コンピュータのメモリに


文字列を取り込み


文字列をまるごとprintf出力表示する方法を考えていくわけなんだ。


コンピュータのメモリに文字列を格納する・・・


配列に文字列を格納するとは結局は


コンピュータのメモリに文字列を格納するということだよね。


そうすることにより


ゲーム画面に文字列をprintf出力表示することができるんだよね


しかし


#include <stdio.h>


int main(void)

{

char hairetu[ ]={'n','e','k','o'};


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

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

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

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


return 0;

}

コンパイル結果

n

e

k

o


このプログラムのままでは

1文字ずつ

しかprintf出力表示できないや。


なんとか



文字列nekoをまるごとprintf出力表示できないかな?」


アレサ

「そうですね。


今までのプログラムをみてもわかるように


#include <stdio.h>


int main(void)

{

char hairetu[4];

hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';


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

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

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

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


return 0;

}

コンパイル結果

n

e

k

o


char型の配列宣言


char hairetu[4];


によって生成される


配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

には

hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';


のように

1文字しか文字をとりこむことができないのです。


ですので


もちろん


文字列neko


を一挙に


hairetu[0]にとりこむようなことはできないし


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


をもちい


文字列nekoをまるごとprintf出力表示することもできません。



そこで文字列nekoをまるごとprintf出力表示するには!


どうしたらいいのでしょうか?


いままでみてきたように


char型の変数宣言

char a;

の変数a



char型の配列変数宣言

char hairetu[5];

によって生成された


配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


には半角英字は

1文字だけ格納することができました


そのさい


半角英字を


' 'シングルクオーテーションで囲って取り込んできました。




では、では、1文字だけでなく


文字列nekoを配列に


とりこんでまるごと文字列nekoをprintf出力表示してみましょう。



その場合は次のようにプログラムを構成します


#include <stdio.h>


int main(void)

{

char hairetu[5];

hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='\0';  (👈ここポイントですの)


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

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

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

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

printf("%s\n",hairetu); (👈ここポイントですの)

return 0;

}


コンパイル結果

n

e

k

o

neko


アレサ

「配列変数に文字を格納する際


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='\0';


hairetu[4]にNULL文字と呼ばれる\0が格納されています。


このように

hairetu[4]に\0を格納することにより


\0より前に

hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

に格納された文字

n

e

k

o



文字列nekoと認識されます


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


のコンパイル結果をみてください。


nekoとなっています。


このようにして


配列hairetuにとりこんだ文字列nekoを表示させるには


%s出力変換指定子を用いて


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


と表記します。」


ソーラー「配列名hairetuをつかって


文字列nekoをprintf出力表示しているんだね。」


アレサ「はいっ


このように


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';


のあとに


hairetu[4]='\0';


を記述する方法で


配列hairetuに文字列nekoをとりこみ


配列名hairetuを使って


まるごと文字列nekoをprintf出力表示することができますの。



ソーラー「


そういえばあちらの世界でも文字列を出力するとき%s変換指定子を


つかっていたような・・・


あのときは全く意味がわからなかったけど(^^)


こんなところで再びでてくるとは(^^)/」


アレサ

「今のプログラムでは


nekoを文字列とコンピュータに認識させるため


4文字の文字n,e,k,oを配列変数に格納したあと


\0も配列変数に格納しました。


ですので


配列の要素数を[4]でなく[5]とし


配列変数を5つ生成する必要がありました。


このように


'\0'、NULL文字を配列変数に格納するため


一般に文字列を取り込むのに


取り込む文字列の数より、


ひとつ多くの要素数を配列宣言にかきこんで


配列変数を1つ多く生成する必要があります。


そして


'\0'は文字列nekoが


printf出力表示されるときには


コマンドプロンプト画面に表示されません。


うまくできていますね。


そして、この\0は


\0の前で


文字列が終わっていることをあらわしています。


ですので


次のプログラムのように文字列nekoを配列に格納するとき


配列変数に文字を取り込む途中で


'\0'を配列変数に格納すると


#include <stdio.h>


int main(void)

{

char hairetu[5];

hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='\0';

hairetu[3]='k';

hairetu[4]='o';


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("%s\n",hairetu);

return 0;

}

コンパイル結果

n

e

(空白)

k

o

ne


コンパイル結果をみてもわかるように


この場合


配列hairetuには文字列nekoでなく


ナル文字\0によりneまでが文字列としてコンピュータに認識され


配列hairetuにとりこまれています。


そのため


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


neだけがprintf出力表示されているのです(^^)の。


neまでが文字列と認識されていても


配列変数に1文字ずつ格納された文字

n

e

k

o


ちゃんとprintf出力表示されていますね。」


ソーラー

「ここで


今のプログラムの


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


に注目してほしいな。


hairetu[2]にはナル文字\0がとりこまれてるね。


それをprintf表示すると


コンパイル結果は


空白


空白になってるんだ


ナル文字\0は不思議だね」










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

作者を応援しよう!

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

応援したユーザー

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