これであなたも scanf_s関数物知り博士(*´▽`*)のコーナーです

これであなたも scanf_s関数物知り博士(*´▽`*)のコーナーです

ソーラー「今日は


scanf_s関数のし・く・み💖について詳しく見ていきましょう



scanf_s関数はVisual Studioのみで使用できる関数なのです


まずは


次のプログラムをご覧ください」


#include <stdio.h>


int main(void) {

printf("文字列を入力してね\n");


char str[100];

scanf_s("%s", str,100);


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


return 0;

}


ビルド実行結果


文字列を入力してね

abcde(と入力すると)

abcde(が表示されます)


マックス「おお


いつもの反応だな」


ソーラー 「 このプログラムでは


配列strに


文字列データ"abcde"


が格納されています




scanf_s関数を使用するには


scanf_s("%s", str,100);


のように


第3引数に配列strに送り込む文字の数を


指定する必要があります


もし


第3引数に何も記述しない状態の


scanf_s("%s", str);


を実行すると


配列strには文字列データは格納されません


その様子を示すプログラムはこちらです」

👇

#include <stdio.h>


int main(void) {

printf("文字列を入力してね\n");


char str[100];

scanf_s("%s", str);//👈第3引数を記述していません このような記述は間違っています


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


return 0;

}


ビルド実行結果


文字列を入力してね

abcde(と入力しても次の行には何も表示されません)



ソーラー「 scanf_s関数を使用する場合は


scanf_s("%s", str,100);


のように


第3引数に配列strに


送り込む文字の数を


指定する必要があるのですね


今日はscanf_s("%s", str,100);


が実行されて


文字列が入力されたとき


どの様なことが起こっているのかを


もう少し詳しく見ていきましょう


もう1度先程のプログラムをご覧ください」

👇


#include <stdio.h>


int main(void) {

printf("文字列を入力してね\n");


char str[100];

scanf_s("%s", str,100);


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


return 0;

}


ビルド実行結果


文字列を入力してね

abcde(と入力すると)

abcde(が表示されます)



ソーラー「 このプログラムでは


abcdeとキーボード入力したあと


Enterキーをおしています」


マックス「( ̄∇ ̄;)ハッハッハ


Enterキーをおさないと


入力完了しないからなあ」


ソーラー「ところで


このカクヨムで小説を書いておられる方なら


よくお分かりになられるとおもうのですが


小説を執筆していて


Enterキー


おすと

次の行へカーソルが移動します


つまり


改行が行われます


実は

abcdeとキーボード入力したあと


Enterキーをおすと


abcdeとキーボード入力したあと


\n(改行)が入力されたことになります


つまり


abcde\nが入力されたことになります」



マックス「なんと まんま\n(改行)が入力されるのか」


ソーラー「実は


キーボードから入力された文字列abcde\nは


まず


配列strのメモリに文字列データが格納される前に


バッファと呼ばれるメモリ領域に


\0が付け加えられた状態で


abcde\n\0と格納されます


その後


配列strのメモリに\nを除いた


文字列データabcde\0が格納されることになります


実は


このとき


文字データ'\n'が


バッファと呼ばれるメモリ領域に


格納されたままなんです」


マックス「ほうほう」


ソーラー「ここからが


面白いのですが


再確認すると


scanf_s("%s", str,100);


が実行されて


文字列データを入力したとします


このとき


バッファと呼ばれるメモリ領域に文字データ'\n'が格納された状態が続いています


ここまではいいですね


scanf_s("%s", str,100);


の実行の後


aのchar型の変数宣言


char a;


を実行して作製された


char型の変数a



1文字だけ文字を入力しようとして


%c出力変換指定子を用いて


scanf_s("%c", &a);


を実行すると


バッファと呼ばれるメモリ領域に'\n'が格納されたままなので


scanf_s("%c", &a);


が実行された瞬間


\n


が入力された


つまり


Enterが入力された


とみなされます


つまり


こちら側からは何も文字を入力していないのに


\n


つまり


Enterが入力された


とみなされます


となると


文字入力完了となるわけです


このとき


バッファと呼ばれるメモリ領域に格納された'\n'は'\0'に変換されて


char型の変数aに格納されることになります


'\0'は空白を表す文字データなので


printf("%c\n", a);


を実行した場合


何も表示されない


(空白データが)表示されることになります


その時のプログラムはこちらです」

👇

#include <stdio.h>


int main(void) {

printf("文字列を入力してね\n");


char str[100];

char a;

scanf_s("%s", str,100);

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


scanf_s("%c", &a);


printf("%c\n", a);


return 0;

}


ビルド実行結果

abcde(と入力すると)

abcde(が表示されます)

(空白)

(空白)


マックス「なんと


キーボードから


abcdeを入力したら


ビルド実行結果


abcde(と入力すると)

abcde(が表示されます)

(空白)

(空白)

までが一瞬で表示された!


scanf_s("%c", &a);


が実行されても


入力受付状態


アンダーバー


_


が表示されるのを見る瞬間がないほどに・・・


なるほど・・・」


マックス「?????


じゃあ


scanf_s("%s", str,100);


が実行された後


abcde


をキーボードから入力した場合


バッファと呼ばれるメモリ領域に文字データ'\n'が格納されたままになるんだろう?


だったら


このとき


再び

scanf_s("%s", str,100);


を実行した場合


バッファと呼ばれるメモリ領域に'\n'が格納されているので


もうすでに


\n


が入力された


つまり


Enterが入力された


とみなされ


つまり


こちら側からは何も文字を入力していないのに


\n


つまり


Enterが入力された


とみなされて


文字入力完了となるんじゃないか?


このときも


バッファと呼ばれるメモリ領域に格納された'\n'は'\0'に変換されて


char型の配列strに格納されることになるはずだよなぁ


多分・・・


'\0'は空白を表す文字データなので


再び

scanf_s("%s", str,100);


を実行したあと


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


を実行した場合


何も表示されない


(空白データが)表示されることになるんだろう


ぐははははっはははははは


どうだ


名推理だろう?」


ソーラー「おしいィ・・・


そうはならないんで~す」


マックス「な、なんでぇ」


ソーラー「配列strに文字列データを格納する


scanf_s("%s", str,100);


が実行された場合


アンダーバー

_


が表示されますが


この状態で


何も文字を入力しないまま


Enterを押しても


文字列データ入力完了とはみなされないんです


ですから


バッファと呼ばれるメモリ領域に'\n'が格納されていて


もうすでに


\n


が入力された


つまり


Enterが入力された状態であっても


文字列データ入力完了とはみなされず


コマンドプロンプト画面には


文字列入力を促す


アンダーバー

_


が表示されたままとなります


そのことを示すプログラムはこちらです」

👇


#include <stdio.h>


int main(void) {

printf("文字列を入力してね\n");


char str[100];


scanf_s("%s", str,100);

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


scanf_s("%s", str, 100);

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



return 0;

}


ビルド実行結果


文字列を入力してね

abcde(と入力すると)

abcde(が表示されます)

_  👈アンダーバーが表示され続けます


マックス「おおう ほんとだ」


ソーラー「さらに この状態で


文字列を1文字も入力しないまま


文字列入力を完了させようとして


Enter



連打しても


ひたすら


コマンドプロンプト画面には


文字列入力を促す


アンダーバー

_


が表示されたままとなります😊(笑)


そのことを示すプログラムはこちらです」

👇


#include <stdio.h>


int main(void) {

printf("文字列を入力してね\n");


char str[100];


scanf_s("%s", str,100);

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


scanf_s("%s", str, 100);

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



return 0;

}


ビルド実行結果


文字列を入力してね

abcde(と入力すると)

abcde(が表示されます)

(Enterを押す)

(Enterを押す)

(Enterを押す)

(Enterを押す)

(Enterを押す)

(Enterを押す)

_  👈アンダーバーが表示され続けます


ソーラー「Enterを連打押ししても


アンダーバーが改行されるだけだね


一文字も文字を入力してないのに


文字列入力を完了させることはできないんだね」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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