文字列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個格納できるということです。


逆に言うと9999文字をこえる文字列は配列hairetuに格納できないということです。


なるべく多くの文字列の入力を受け付けても大丈夫なように


要素数を10000にしました。


そして


この場合ではnekoは


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='\0';

のように

char型の配列変数に格納されています」


アレサ「このように


nekoは文字列であるので

n,e,k,oにつづいて

\0が

char型の配列変数に格納されているのですの。」


ソーラー「ここで


scanf関数の使い方にご注目下さい。


1文字をscanf関数をつかって変数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"は文字列データというわけさ。


つまり


printf("neko");に無駄な表現部分はないんだなあ。


同様に


char hairetu[]="neko";


にも無駄な表現部分はないんだね。」


アレサ「実は


char hairetu[]="neko";


は自然な記述方法だったというわけですね」


ソーラー

「そう、そう


実は


適当にダブルクォーテーションをつけて


char hairetu[]="neko";


にしてるとおもってたんだ~


そうじゃなかったんだね。


ここで ちょこっと遊んで1文字の文字列 a を


入力待ち受け状態のコマンドプロンプト画面でうちこんでも


aと出力されます。


そう


😊 scanf関数を使って



                 配列に




 1文字の文字列でも複数の文字列でもとりこむことができる😊


   


ということです。


いやあ


まあ、当然か😊   」


アレサ 「

scanf("%c",&a);をつかって

文字を1文字、格納するときと


scanf関数と配列をつかった

scanf("%s",hairetu);をつかって


1文字の文字列を格納するときの違いは


ヌル文字\0を格納するかしないかということですね


コマンドプロンプト画面から入力された


文字aの格納先にchar型の変数aをもちいるなら


文字データ'a'



char型の変数aに


char a='a';



コマンドプロンプト画面から入力された


文字aの格納先に配列hairetuをもちいるなら


文字データ'a'と'\n'



配列変数


hairetu[0]='a';

hairetu[1]='\0';



格納されています😊」



ソーラー「ね、ね アレサ


結局 scanf関数は数値も1文字も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で共有
  • はてなブックマークでブックマーク

作者を応援しよう!

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

応援したユーザー

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