🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
cinを使って空白を含んだ文字列"Hello nyannko"を配列にとりこむとcoutを使ってHelloまでしか表示できません 配列内にどのようにデータは格納されているのでしょうか
cinを使って空白を含んだ文字列"Hello nyannko"を配列にとりこむとcoutを使ってHelloまでしか表示できません 配列内にどのようにデータは格納されているのでしょうか
ソーラー「では みなさ~ん、次はcinを使って空白を
真ん中に含んだ文字列データ
"Hello nyannko"
が
char型の配列hairetuに格納できるか試してみましょ~~う。
空白はどのようにあつかわれるのかな?
空白はナル文字\0として認識されるのかな?
プログラムは次のようになります」
#include <iostream>
using namespace std;
int main() {
char hairetu[10000];
cin >> hairetu;
cout<<hairetu<<"\n";
return 0;
}
ソーラー「
このプログラムをビルドして
アンダーバー
_
が表示される
入力待機中のコマンドプロンプト画面で
Hello nyannko
とうちこむと・・・・・
ビルド実行結果
Hello nyannko (と入力すると)
Hello (だけが表示されます)
ソーラー「残念!
空白を含んだ文字列データ
Hello nyannko
を
cin >> hairetu;
を実行して
配列hairetuに格納したわけだけど
cout<<hairetu<<"\n";
が実行されても
Helloまで
しかコマンドプロンプト画面にcout出力表示されないね。
にゃんこちゃん でてこないね・・・
今日も元気かな?
これはいったいどうなっているのかな?」
てんC 「このとき
文字列Hello nyannkoは
char hairetu[10000];
によって生成されるchar型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
hairetu[5]
hairetu[6]
hairetu[7]
hairetu[8]
hairetu[9]
hairetu[10]
hairetu[11]
hairetu[12]
hairetu[13]
hairetu[14]
に
どのように
格納されているか
プログラムを構成して実行して確かめてみます」
そのプログラムはこちらです
👇
#include <iostream>
using namespace std;
int main() {
char hairetu[10000];
cin >> hairetu;
cout << hairetu << "\n";
cout << hairetu[0] << "\n";
cout << hairetu[1] << "\n";
cout << hairetu[2] << "\n";
cout << hairetu[3] << "\n";
cout << hairetu[4] << "\n";
cout << hairetu[5] << "\n";
cout << hairetu[6] << "\n";
cout << hairetu[7] << "\n";
cout << hairetu[8] << "\n";
cout << hairetu[9] << "\n";
cout << hairetu[10] << "\n";
cout << hairetu[11] << "\n";
cout << hairetu[12] << "\n";
cout << hairetu[13] << "\n";
cout << hairetu[14] << "\n";
return 0;
}
ビルド実行結果
Hello nyannko (と入力すると)
Hello (だけが表示されます)
H
e
l
l
o
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
てんC「このとき
char型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
hairetu[5]
hairetu[6]
hairetu[7]
hairetu[8]
hairetu[9]
hairetu[10]
hairetu[11]
hairetu[12]
hairetu[13]
hairetu[14]
には
hairetu[0]='H'
hairetu[1]='e'
hairetu[2]='l'
hairetu[3]='l'
hairetu[4]='o'
hairetu[5]='\0 '👈ここです
hairetu[6]='ㇷ'
hairetu[7]='ㇷ'
hairetu[8]='ㇷ'
hairetu[9]='ㇷ'
hairetu[10]='ㇷ'
hairetu[11]='ㇷ'
hairetu[12]='ㇷ'
hairetu[13]='ㇷ'
hairetu[14]='ㇷ'
と文字データが配列変数に格納されています
hairetu[5]='\0 '👈ここです
以降の配列変数
hairetu[6]
hairetu[7]
hairetu[8]
hairetu[9]
hairetu[10]
hairetu[11]
hairetu[12]
hairetu[13]
hairetu[14]
には
何もデータが格納されなかったことになり
cout << hairetu[6] << "\n";
cout << hairetu[7] << "\n";
cout << hairetu[8] << "\n";
cout << hairetu[9] << "\n";
cout << hairetu[10] << "\n";
cout << hairetu[11] << "\n";
cout << hairetu[12] << "\n";
cout << hairetu[13] << "\n";
cout << hairetu[14] << "\n";
が実行されると
hairetu[6]
hairetu[7]
hairetu[8]
hairetu[9]
hairetu[10]
hairetu[11]
hairetu[12]
hairetu[13]
hairetu[14]
が初期化されていないときに最初から格納されているデータに応じた
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
がコマンドプロンプト画面に表示されます
ここで
👈で示される
hairetu[5]='\0 '
が注目のポイントなんです。
ナル文字\0が格納されています
つまり
コンパイラは
Helloプラス(半角スペース)
と
コマンドプロンプト画面から
入力された時点で
Hello\0
とデータが入力されたと見なしているわけです。
そして
このナル文字\0は文字列データ"Hello"の1部として
配列hairetuにとりこまれています。
ナル文字\0
が
配列変数
hairetu[5]に
hairetu[0]='H'
hairetu[1]='e'
hairetu[2]='l'
hairetu[3]='l'
hairetu[4]='o'
hairetu[5]='\0 '👈ここです
のように
格納されていると
配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
hairetu[5]
に格納されている文字データ
'H'
'e'
'l'
'l'
'o'
'\0 '
は
ひとまとまりの文字列データ
"Hello"
として
配列hairetuに格納されているとコンピュータには認識されます。
そして
ここが重要なのですが
この場合
配列hairetuには
文字データ
'H'
'e'
'l'
'l'
'o'
'\0 '
だけが
格納されているとコンピュータには認識されます
ですので
cout << hairetu << "\n";
が実行されると
Hello
がコマンドプロンプト画面に表示されるというわけです。
逆に次のプログラムのように
cinをつかわず
直接
char hairetu[100]="Hello world";
を実行してみると
#include <iostream>
using namespace std;
int main() {
char hairetu[100] = "Hello world";
cout << hairetu << "\n";
return 0;
}
ビルド実行結果
Hello world
と
空白部分もちゃんと
cout出力表示されます、
また
char hairetu[100];
によって生成される配列変数に
hairetu[0]='H';
hairetu[1]='e';
hairetu[2]='l';
hairetu[3]='l';
hairetu[4]='o';
hairetu[5]=' ';
hairetu[6]='n';
hairetu[7]='y';
hairetu[8]='a';
hairetu[9]='n';
hairetu[10]='n';
hairetu[11]='k';
hairetu[12]='o';
hairetu[13]='\0';
と
hairetu[5]=' \0';
のように
ナル文字\0でなく
hairetu[5]=' ';
と
本当の(笑)
空白スペースを
配列変数
hairetu[5]
に格納した場合でも
配列に格納されている文字列データ"Hello nyannko"を
次のプログラムのように
cout出力表示することができます。
#include <iostream>
using namespace std;
int main() {
char hairetu[100];
hairetu[0] = 'H';
hairetu[1] = 'e';
hairetu[2] = 'l';
hairetu[3] = 'l';
hairetu[4] = 'o';
hairetu[5] = ' ';
hairetu[6] = 'n';
hairetu[7] = 'y';
hairetu[8] = 'a';
hairetu[9] = 'n';
hairetu[10] = 'n';
hairetu[11] = 'k';
hairetu[12] = 'o';
hairetu[13] = '\0';
cout << hairetu << "\n";
return 0;
}
ビルド実行結果
Hello nyannko
ソーラー「なんと 半角空白スペースは
文字列データ
"Hello nyannko"
の1部になっているんだね。
つまり
空白もちゃんと文字データになっているんだ。
空白スペースが
ちゃんと文字列の1部とみなされるのはいいシステムだね。
このプログラムの
hairetu[5]に格納される文字を
hairetu[5]=' ';
のように空白から
次のようにナル文字\0に
hairetu[5]='\0';
とかきかえて
プログラムを実行してみると
#include <iostream>
using namespace std;
int main() {
char hairetu[100];
hairetu[0] = 'H';
hairetu[1] = 'e';
hairetu[2] = 'l';
hairetu[3] = 'l';
hairetu[4] = 'o';
hairetu[5] = '\0';
hairetu[6] = 'n';
hairetu[7] = 'y';
hairetu[8] = 'a';
hairetu[9] = 'n';
hairetu[10] = 'n';
hairetu[11] = 'k';
hairetu[12] = 'o';
hairetu[13] = '\0';
cout << hairetu << "\n";
return 0;
}
ビルド実行結果
Hello
てんC「この場合は
hairetu[5]='\0';
の前の
hairetu[0]から
hairetu[4]までの配列変数に格納された文字達だけが
コマンドプロンプト画面にcout出力表示されています。
hairetu[0]='H';
hairetu[1]='e';
hairetu[2]='l';
hairetu[3]='l';
hairetu[4]='o';
のように
格納されている文字データを
1まとまりの文字列データ"Hello"と
コンピュータに認識させるナル文字\0が
hairetu[5]='\0'と
格納されているため
コンピュータは
"Hello"という文字列データが
配列hairetuに格納されていると認識します。
そのため
cout << hairetu << "\n";
が実行されると
文字列Helloが
コマンドプロンプト画面にcout出力表示されます。」
ソーラー「空白が配列変数に書き込まれた場合は
空白も文字データとして
文字列データの1部となるけど
配列変数に
ナル文字\0が書き込まれた場合は
それまでに配列変数に格納された文字データたちは
1まとまりの
文字列データとみなされるんだね。
そして
ナル文字\0は
それまでに配列変数に格納された文字データたちを
1まとまりの文字列データと
コンピュータに認識させるためにあるので
cout << hairetu << "\n";
が実行されると
文字列Helloだけが
コマンドプロンプト画面に表示されるわけだ
だけど次のプログラムのように
#include <iostream>
using namespace std;
int main() {
char hairetu[10000];
cin >> hairetu;
cout << hairetu << "\n";
cout << hairetu[0] << "\n";
cout << hairetu[1] << "\n";
cout << hairetu[2] << "\n";
cout << hairetu[3] << "\n";
cout << hairetu[4] << "\n";
cout << hairetu[5] << "\n";
cout << hairetu[6] << "\n";
cout << hairetu[7] << "\n";
cout << hairetu[8] << "\n";
cout << hairetu[9] << "\n";
cout << hairetu[10] << "\n";
cout << hairetu[11] << "\n";
cout << hairetu[12] << "\n";
cout << hairetu[13] << "\n";
cout << hairetu[14] << "\n";
return 0;
}
ビルド実行結果
Hello nyannko (と入力すると)
Hello (だけが表示されます)
H
e
l
l
o
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ㇷ
ソーラー「
ナル文字\0を格納している
配列変数 hairetu[5]の中に格納されているデータを
表示する
cout << hairetu[5] << "\n";
の実行結果が
ビルド実行結果
(空白)
となっていることから
ナル文字\0は空白スペースの役目を果たすのかと思い
"Hello nyannko"をひとまとまりの文字列データと認識させることができる
hairetu[0] = 'H';
hairetu[1] = 'e';
hairetu[2] = 'l';
hairetu[3] = 'l';
hairetu[4] = 'o';
hairetu[5] = '';//🌞ここです
hairetu[6] = 'n';
hairetu[7] = 'y';
hairetu[8] = 'a';
hairetu[9] = 'n';
hairetu[10] = 'n';
hairetu[11] = 'k';
hairetu[12] = 'o';
hairetu[13] = '\0';
の代わりに
hairetu[0] = 'H';
hairetu[1] = 'e';
hairetu[2] = 'l';
hairetu[3] = 'l';
hairetu[4] = 'o';
hairetu[5] = '\0';//🌞ここです
hairetu[6] = 'n';
hairetu[7] = 'y';
hairetu[8] = 'a';
hairetu[9] = 'n';
hairetu[10] = 'n';
hairetu[11] = 'k';
hairetu[12] = 'o';
hairetu[13] = '\0';
を実行しても
Hello nyannkoは
ひと固まりの文字列データとは認識されないんだね
ナル文字\0を
空白スペース
として文字データとして
Hello nyannko の
文字列データのなかに含めることはできないんだね。
こうなってくると
cinをつかって
Hello nyannko
のような
空白を含んだ文字列データを
配列に格納することができないね
空白の部分は
\0とコンパイラに翻訳されて
コンピュータに伝えられてしまうからね
じゃあ
cinをつかって
キーボードから
Hello nyannko
と打ち込んだとき
文字列データ
"Hello nyannko"
を入力したことにするにはどうしたらいいのかな?」
つ 💖 づ 💖 く 💖・・・
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます