文字列データ”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のアドレスにあてて格納していることに変わりはありません。


くわしくはポインタ変数のエピソードをみてね💖

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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