天国にいけるC言語入門 ヘキサ構造体 ver5.2130
文字列データ”neko”をscanf関数をつかって配列に格納する。文字列データを格納できるということは1文字の文字列データを格納することもできます。やったね💖
文字列データ”neko”をscanf関数をつかって配列に格納する。文字列データを格納できるということは1文字の文字列データを格納することもできます。やったね💖
文字列データ”neko”をscanf関数をつかって配列に格納する。文字列データを格納できるということは1文字の文字列データを格納することもできます。やったね💖
アレサ「おまけで解説すると💦💦
#include <stdio.h>
int main(void)
{
char hairetu[]="neko";
printf("%s",hairetu);
return 0;
}
は%s出力変換指定子をもちいなくても
#include <stdio.h>
int main(void)
{
char hairetu[]="neko";
printf(hairetu);
return 0;
}
と記述することもできます。
プログラムの実行結果はどちらも
neko続行するには何かキーを押して下さい
となります」
ソーラー
「では みなさ~ん、
次に
scanf関数を使って
文字列データ"neko"
を
char型の配列hairetuに格納してみましょう。
#pragma warning(disable: 4996)
#include <stdio.h>
int main(void)
{
char hairetu[10000];
scanf("%s",hairetu);
printf("%s\n",hairetu);
return 0;
}
このプログラムを実行して
_
アンダーバーが表示されている
入力待ち受け状態のコマンドプロンプト画面でキーボードから
nekoとうちこむと
nekoがprintf出力表示されます。
簡単ですね。
このプログラムの
char hairetu[10000];
を観察すると
配列の要素数が10000になっています。
配列の要素数が10000ということは
この配列hairetuには
'a'や'b'等の文字データが9999個とナル文字データ'\0'が1個格納できることになります
'a'や'b'等の文字データが9999個とナル文字データ'\0'
で
9999文字の文字列データを形成するので
9999文字の文字列データが格納できることになります
逆に言うと9999文字をこえる文字列データは配列hairetuに格納できないことになります
9999文字の文字列データとは
たとえば
"aaaaaaaaaaaaaaaaaaaabbbbbbbbbbbb(途中省略)zzzzzzzzzzzzzzzz"
👆9999個の半角英数字がダブルクォーテーション"で囲まれています
のようなものを指します
あるいは
"あいうえおかきくけこさしすせそ(途中省略)z"
👆4999個の全角文字の平仮名と半角英数字zがダブルクォーテーション"で囲まれています
(平仮名は半角英数字文字分として取り扱われます)
のようなものを指します
なるべく多くの文字列の入力を受け付けても大丈夫なように
要素数を10000にしました。
そして
このプログラムの場合では
文字列データ
"neko"
が
char型の配列変数
hairetu[0]
hairetu[1]
hairetu[2]
hairetu[3]
hairetu[4]
に
hairetu[0]='n';
hairetu[1]='e';
hairetu[2]='k';
hairetu[3]='o';
hairetu[4]='\0';
のように格納されています」
アレサ「このように
"neko"は文字列データであるので
'n','e','k','o'につづいて
'\0'が
char型の配列変数に格納されているのですの。」
ソーラー「ここで
scanf関数の使い方にご注目下さい。
scanf関数をつかって
1文字の文字データをchar型の変数aに格納するには
scanf("%c",&a);
と記述します
変数aの前に&(アンパサンド)をつけた変数aのアドレス&a(データを格納する場所)
のメモリにあてて1文字の文字データをうけとっています
ですが 文字列データをscanf関数をつかって配列hairetuに格納するときには
scanf("%s",hairetu);
のように配列hairetuの前に
&はつかないのです。
なぜでしょうか?
不思議だね
"この部分は後述されます"
ね、ね アレサ
ところで
char hairetu[]="neko";
って表現って本当もろに
char型の配列hairetu[]に文字列データ"neko"を格納してるって思うんだ。
普通は文字列nekoをコマンドプロンプト画面に
printf出力表示するとき
printf("neko");
と記述するよね
なんで
printf(neko);
とならず
printf("neko");
とダブルクォーテーションがつくのか、とおもってた人もいるよね。
それは
nekoだけではコンピュータはデータとして認識できないからなんだよ
nekoを文字列データとしてコンピュータに認識させるために
ダブルクォーテーションがつけられているってわけなんだよね
nekoに" "をつけた
"neko"は文字列データとなるというわけさ。
つまり
printf("neko");の
" "は必要だからついているわけだね
同様に
char hairetu[]="neko";
の
""は必要だからついているわけだね」
アレサ「実は
char hairetu[]="neko";
は自然な記述方法だったというわけですね」
ソーラー
「そう、そう
実は
適当にダブルクォーテーションをつけて
char hairetu[]="neko";
にしてるとおもってたんだ~
そうじゃなかったんだね。
ここで ちょこっと遊んで
#pragma warning(disable: 4996)
#include <stdio.h>
int main(void)
{
char hairetu[10000];
scanf("%s",hairetu);
printf("%s\n",hairetu);
return 0;
}
を実行して
1文字の文字列 a を
入力待ち受け状態のコマンドプロンプト画面で
キーボードからうちこんでも
aと出力されます。
%s出力変換指定子に御注目下さい
scanf("%c",a);
のように
char型の変数aに
%c出力変換指定子が用いられていると
例えば
キーボードから
a
を
入力すると
文字データ
'a'
が入力されたと見なされ
char型の変数aに文字データ'a'が格納されることになりますが
scanf("%s",hairetu);
のように
hairetuに
%s出力変換指定子が用いられていると
文字列データが入力されているとみなされます
例えば
キーボードから
a
を
入力すると
文字データ
'a'
でなく
文字列データ
"a"
が
配列hairetuに格納されることになります
文字列データ
"a"
は
文字データ
'a'
と
'\0'
から構成されているので
文字データ
'a'
と
'\0'
が
配列hairetuの配列変数
hairetu[0]
hairetu[1]
に格納されることになります
そう
😊 scanf関数を使って
配列に
💖文字列データも💖
とりこむことができる😊
んです。
いやあ
まあ、当然か😊 」
アレサ 「
scanf関数とchar型の変数aをつかった
scanf("%c",&a);をつかって
文字を1文字、格納するときと
scanf関数と配列をつかった
scanf("%s",hairetu);をつかって
1文字の文字列を格納するときの違いは
ヌル文字\0を格納するかしないかということですね
コマンドプロンプト画面から入力された
文字aの格納先にchar型の変数aと%c出力変換指定子をもちいるなら
文字データ'a'
が
char型の変数aに
char a='a';
と
格納されます
コマンドプロンプト画面から入力された
文字aの格納先に配列hairetuと%s出力変換指定子をもちいるなら
文字データ'a'と'\0'
が
配列変数
hairetu[0]='a';
hairetu[1]='\0';
に
格納されています😊」
ソーラー「ね、ね アレサ
結局 scanf関数は
格納先がint型の変数なら
数値データ
格納先がchar型の変数なら
1文字の文字データ
格納先が配列なら
文字列データ
も
うけとることができる素敵な関数さんなんだね。
今度scanf関数を連れて
みんなでおいしいパン屋の店にいかないかい?」
アレサ「そうですね。
scanf関数さん 喜ぶとおもわれます。」
◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇
今までは整数値をscanf関数をつかって変数aに格納するには
scanf("%d",&a);
のように
変数aの前に&をつけた変数aのアドレス&aにあてて整数値をうけとっていました。
ですが 文字列をscanf関数をつかって配列hairetuに格納するときには
scanf("%s",hairetu);
のように配列hairetuの前に
&はつかないのです。
ポインタ変数のエピソードで説明されますが
scanf("%s",hairetu);
の
hairetuは
😊配列hairetuのアドレス😊を格納しているポインタ変数となっています
ですので
とりこんだ整数値データを 変数aのアドレス&aにあてて格納したように
とりこんだ文字列データを
配列hairetuのアドレスにあてて格納していることに変わりはありません。
くわしくはポインタ変数のエピソードをみてね💖
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます