これであなたも 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を連打押ししても
アンダーバーが改行されるだけだね
一文字も文字を入力してないのに
文字列入力を完了させることはできないんだね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます