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出力表示することができるんだよね


しかし


#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

👆

じっとみてくださいね。



てんC「

char型の配列宣言


char hairetu[4];


によって生成される


char型の配列変数


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が格納されています。


このように


char hairetu[5];

をおこない

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


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';


と格納された文字データ


'n'

'e'

'k'

'o'



文字列データ"neko"と認識されます


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


の実行結果をみてください。


nekoとなっています。


このようにして


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


配列名hairetuに%s出力変換指定子を用いて


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


と表記します。


このように


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

のあとに


hairetu[4]='\0';


を記述する方法で


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


まるごと文字列nekoをprintf出力表示することができるようになります。」



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


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


アレサ「はいっ


今のプログラムでは


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


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


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


ですので


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


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


このように


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("%c\n",hairetu[0]);

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

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

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


により


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


ソーラー

「ここで


今のプログラムの


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


に注目してほしいな。


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


それをprintf表示すると


プログラムの実行結果は


空白


空白になってるんだ


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










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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る