こんにちは､ そしてようこそ｡
この講義では､ キーボードからの入力を読み取ることについてお話したいと思います｡
これは非常に価値のあるもので､ 多くのプログラムがインプットを必要とするため､
皆さんに早く覚えてほしかった基本的な概念なのです｡
だから､ 早い段階でこれを提供したんです｡
コンセプトが完全にクリアにならないものもあります｡
しかし､ これらの概念は他のセクションで順次学んでいくことは間違いありませんが､
これを非常に早い段階で学ぶことが重要で､ printf関数と非常によく似ています｡
そこで､ アウトプットについて議論しました｡
printf を使って出力をフォーマットする方法は知っています｡
今度は入力について少し学ばなければなりません｡ 基本的にユーザーから入力を得ることです｡
プログラムにデータを入力してもらうと､ とても便利です｡
コマンドライン引数でデータを入力するという話をしましたが､ そういう方法もあるんですね｡
また､ キーボードで何か入力できるように､ ユーザーに直接依頼する方法もあります｡
つまり､ キーボードから入力しても､ 端末（コンソール）を通じて入力した内容が表示されるわけです｡
それが入力の方法です｡
cライブラリはいくつかの入力関数を含んでいます｡
今回はscanfを使用します｡
それが最も汎用的な機能です｡
とても便利です｡
入力できるさまざまな形式を提供します｡
そのため､ テキストを入力すると､ さまざまな形式に変換されます｡
つまり､ scanfは標準入力ストリーム､ つまりstdinから入力を読み取るわけです｡
Scanfは､ 入力ストリームがファイルであれば､ 実はファイルからの読み込みにも使える｡
しかし､ 今はそのようなことは気にせず､
キーボードからの入力を読み取るために使用することにします｡
さて､ デフォルトではstdinはキーボードです｡
Stdinはストリームです｡
ストリームとC､ 3つの異なるストリーム｡
エラーストリーム､ 標準入力､ 標準出力｡
デフォルトで標準搭載されているのはキーボードです｡
だから､ このままでいいと思っています｡
そして､ scanfを使って標準入力から読み込んで､
入力した内容やデータの保存方法に基づいて､
入力した内容を変換するのです｡
そのテキストを､ あなたが提供したフォーマットに変換してくれるのです｡
printf関数と同じように書式指定子を使用することになります｡
ですから､ 書式は文字の並びでもよく､ これを文字列と呼びます｡
まだあまり詳しく調べてはいないのですが｡
しかし､ データ型について話すときは､ また別の機会に｡
さらに､ 整数や数値など､ これから説明する他のデータ型も指定することができます｡
だから数字が読めるんですね｡
文字列を読むことができます｡
小数を含む数字や､ 1文字ずつの文字も読めるなど､
いいことずくめです｡
キーボードからの入力が標準の場合､ キーボードからテキストを入力すると､
そのテキストをcプログラムに取り込み､ テキストを変換することになります｡
そしてテキストとは､ 文字や数字､ 句読点といったものです｡
だから､ 数字を入力しても､ キーボードから入力されるからテキストなんです｡
つまり､ 2014という整数を入力した場合､ これは数字であり､ 本質的に起こっていることは､ 文字2ゼロ1と4を入力しているということです｡
そして､ 何が起こっているかというと､ その入力をCプログラムに追加しているのです｡
そして､ そのデータを数値として保存したいのであれば､ そのデータを変換する必要があります｡
それで､ printfのときと同じように､ どのように変換するかをフォーマット指定子で指定する必要があるのです｡
printfと同じように､ 整数を表示するにはパーセントdを使うことを覚えておいてください｡
文字列を数値に変換する場合は､ scanfと同様にパーセントdを使って整数に変換することになります｡
そして､ それを早い段階でベーシックにすることです｡
数字を使うのは､ これまで数字を知っていたからで､
文字列についてはまだあまり学習していないのです｡
だから､ 入力するときは主に数字を使うことにしているんだ｡
だからscanf｡
printfとよく似ています｡
しかし､ その代わり､ 取るべきある種の論法が少し違います｡
制御文字列の後に引数のリストを使用するのは変わりません｡
だから､ この二重引用符の中に何かが入っているはずです｡
二重引用符は通常1つのものしか含まず､ それはフォーマット指定子です｡
どうやってデータを変換するんだ｡
つまり､ 制御文字列は､ 入力された文字列の宛先データ型を示す｡
そのフォーマット指定､ パーセントd､ パーセントc､ パーセントs､
フロー用のパーセントfなどです｡
printf関数は､ 引数に変数名や定数､ 式を使うことを学習するからです｡
二重引用符で囲まれているものがありますね｡
そして､ 二重引用符の内側には､ 書式指定子を使用します｡
そして､ カンマの後に､ 変数を出力したり､ 式を出力したりすることもできます｡
式についても､ もっと詳しく説明します｡ 基本的に値を返すものです｡
最も一般的な式の種類は算術式です｡
scanf関数は､ 実際に変数を表示するのではなく､
指し示された変数を使用するという点が異なります｡
しかし､ 幸運なことに､ ポインターはC言語の大きな概念である｡
scanf関数を理解し使用するために､ ポインターについて何も知る必要はありません｡
だから､ そんなことは気にしなくていいんです｡
よし､ あとはscanf関数を使うために､ 3つのルールを覚えておくだけだ｡
読み取りに成功したアイテムの数が返されるんだ｡
つまり､ 1変数､ 2変数､ 3変数を読み取ったら､ それを返すということです｡
もし､ これから説明するint､ float､ doubleのような基本的な変数の型の値を読み取るためにscanfを使うなら､
変数名､ 引数の前にアンパサンドを付けるだけでよいのです｡
それがなぜなのか､ 今すぐ知る必要もないでしょうが､ とにかく基本的なデータ型のどれでもいいので､
やってみてください｡
アンパサンドはアドレスです｡
そして､ scanfは参照を解除しなければならないポインタを取るので､ アドレスを渡さなければならない｡
scanfの3つ目の注意点は､ 覚えておくことです｡
文字の並びである文字列をscanfで1文字に読み込む場合､
アンパサンドを使う必要はない｡
つまり､ 基本的にscanfは2つの引数を取りますが､ これからその例をお見せします｡
最初の引数は､ 入力されたデータをどのように変換するかということになる｡
そして､ そのデータをintで保存する場合は､ percent use format specifier
percent dを使用します｡
まだ習っていない文字列を格納したい場合は､ パーセントsを使います｡
第2引数は､ printfと同じように実際の変数､ 変数名であるため､
使用する書式指定子の数によって多くの引数になる可能性があります｡
また､ 変数が文字列以外のものであれば､ アンパサンドを使うだけです｡
そうでなければ､ アンパサンドは使いません｡
また､ Scanf関数は､ 空白を利用して､ 入力をどのように分割してフィールドに入れるかを決定します｡
そして､ ホワイトスペースには､ 改行､ タブ､ スペースが含まれます｡
printfが一重引用符の中の書式指定子の数によって多くの変数を表示できるのと同じように､
scanfでも同じことができるからです｡
scanfが二重引用符の中に複数のものを持つ場合､ 複数の入力を読み取ることになります｡
そして､ 入力は新しい行で分割されることになります｡
ですから､ もう一度､ scanfが何であるかを理解しようとするならば､
printfの逆なのです｡
Printfは､ 整数､ 浮動小数点数､ 文字列､ これらすべての異なるデータ型を変換し､
テキストに変換し､ 出力するのを見ることができます｡
そして､ それが画面に表示されるのです｡
スキャンフはその逆です｡
テキストを入力とし､ ints､ float､ doublesといったさまざまなデータ型に変換するのです｡
では､ 例を見てみましょう｡
これは､ 私たちの簡単なプログラムの例です｡
主なルーチンはわかっています｡
includeディレクティブが何であるかは分かっている｡
文字や整数はまだ習っていません｡
しかし､ 基本的にはメイン関数の一番上で､ データを保存する必要があるため､
2つの変数を作成しています｡ 変数については､ これからもっと詳しく説明します｡
しかし､ printf関数と同じように､ また､ 逆のことをやっているだけなのです｡
ここでは､ 値を入力してくださいと画面に出力しているわけです｡
二重引用符の中のScanfは､ 入力を読み込むための書式指定子を持っています｡
そして､ 読み込むデータを指定する必要があります｡ ここでは､
パーセントs､ パーセントdと書いてあります｡
つまり､ 文字列を読み込んでから､ intを読み込んでいるのです｡
そして､ この文字列には最初のカンマの後のアンパサンドとscanfがないことに気がつくでしょう｡
そして､ 2つ目のカンマの後には､ 整数なのでアンパサンドがあります｡
数字で読んでいるのです｡
そして､ printfが出力を表示している｡
つまり､ この文字列をこの整数に入力したと言っているのです｡ ちょうどprintfが何をするか知っているように､
そしてmain関数は0を返します｡
では､ この例をコードブロック単位でちょっと見てみましょう｡
ただ､ いくつかのコンセプトを再確認しておきましょう｡
プログラムがキーボードからの入力を収集するためにscanfを使用する場合､ いくつかのテキストを入力するために待機します｡
だから､ 実際にはデータを入力するまでプログラムは一時停止することになる｡
そして､ 一度何かテキストを入力します｡
そして､ 空白を入力しても､ 複数入力しても､ 実際にエンターボタンを押したら､
プログラムが進行して入力を読み込んでくれるのです｡
エンターボタンを押す必要があります｡
繰り返しますが､ scanfはあなたが提供したのと全く同じフォーマットで入力を期待します｡
つまり､ パーセントsやパーセントeと言った場合､ 文字列の後にスペース､
スペースの後に任意の数の整数､ 数字､ 単語を用意しなければならないということです｡
Stringは単語 integerは数値｡
では､ この例を1行ずつコードブロックにして見ていきましょう｡
さて､ ここでメイン関数を作成しました｡
そしてまた､ プログラムにデータを入力できることが重要です｡
つまり､ printfと同じように､ 非常に似たようなものになり､ このコードをすべて理解する必要はないのです｡
そして､ 渡されるパラメータまで取り除いてしまう､
シンプルなメイン関数です｡
このコードをすべて理解する必要はないのです｡
この際､ 変数が何であるかを理解する必要もないでしょう｡
しかし､ 変数はデータを保存します｡
例では､ 100とセミコロンで文字列配列を作成し､ さらにprintfと同じように整数を作成しているだけです｡
整数はありますが､ 文字列を使っています｡
ただ､ さまざまな入力を実証したいだけなのです｡
そして､ キーボードからの入力を得るためにscanf関数を呼び出す前には､ たいていいつもユーザーに何かを伝えようとしています｡
何を入力すればいいのか､ 教えてあげたいんですよね｡
つまりprintfは､ データを画面に表示する､ と覚えておいてください｡
値を入力するというだけです｡
そして､ 実際にカップルを入力し､ セミコロンで終了させるのです｡
ユーザーに何かを入力するように指示しなければならない｡
さて､ ここでscanf関数を使用します｡
scanfと言い､ 括弧の中の二重引用符の中の最初の引数は､
これから読み込むデータである｡
つまり､ この例では､ intである1つの入力パーセントdだけを読み込むとします｡
そして､ そのデータを見たいので変数に格納します｡
そして､ それはIになる｡
ここで､ その前にアンパサンドを指定する必要があるのですが､ これはポインタに関するこの小さなトリックを思い出してください｡
理由は知らなくてもいい､ アドレスだけでいいんです｡
つまり､ 17行目のscanfは､ ユーザーがエンターボタンを押すまで､ 実際にキーボードからデータを読み取ろうとしているのです｡
そして､ そのデータはIという変数に格納されることになります｡
だから､ 今は入力したものを印刷したいだけなのです｡
ここでは､ 読みやすいように改行を追加して､ エスケープシーケンスであるバックスラッシュnを使って､
youと言うことにします｡
パーセントdを入力したので､ その変数の値を表示します｡
そして､ その後に改行も入れます｡
つまり､ 表示させたい変数の値はiです｡
セミコロンで終わらせます｡
そして､ それが私たちのプログラムです｡
つまり､ 出力を印刷し､ 値を要求し､ 入力行を読み､ 読み込むデータが整数であることを指定し､
それを格納し､ アンパサンドを使って､ 今入力したものをプリントアウトするのです｡
では､ これをビルドして実行してみましょう｡
そして､ プログラムが起動し､ 値を入力するために一時停止するのがわかると思います｡
値を入力してくださいということです｡
だから､ この時点で､ 文字列に変換できる数値を入力しなければならないのです｡
だからここでは､ 56とします｡
そして､ エンターキーを押す｡
ウィルススキャナーで2回実行されたからです｡
だから､ 56と言いながら入力するんです｡
そして､ 56と入力した､ とプリントアウトされる｡
だから､ 情報､ 番号を入力すると､ 変数に格納されるようになった｡
さて､ printfと同じように､ 実際に複数のものを入力させ､
複数の変数に格納することができます｡
つまり､ 文字列を入力させるということです｡
ここで､ 単語であればアンパサンドをつける必要はないことを思い出してください｡
だから､ かき混ぜるだけで､ そのデータを変数ストアに格納したいんだ｡
そして再び､ 変数について学びます｡
そして､ そのままプリントアウトしてしまうのです｡
そして､ printfの前にコロンで区切って､
印刷する形式を指定するように､ もう一つ変数を追加しました｡
ということで､ ご理解いただけたでしょうか｡
これから､ スペースで区切られた2つの入力を読み込んで､ Iとstirという2つの変数に格納し､
表示することにします｡
だから今､ 私たちが作って走れば｡
ここでは､ 22という数字を入力し､ スペースを押して､ 名前を入力し､ リターンを押してください｡
そうすると､ プログラムが一時停止して､ 入力した数字と文字列が表示されるんだ｡
だから､ 22とジェイソンが表示される｡
このように､ 4､ 5行の簡単なコードで､ ユーザーからの入力を得ることができるわけです｡
もうひとつ簡単に紹介すると､ ダブルで読む方法です｡
この後のレッスンで､ floatの読み方を説明しますが､ 通常はパーセントfで指定された書式を使用します｡
しかし､ ダブルで実行し､ 読む場合は､ 実際にはパーセントLFを使用して少し異なっているので､
ちょっと頭の片隅に入れておいてください｡
変数名double xを作り､ それをscanfで読み込む場合､ パーセントLFで読み込む必要があります｡
それが､ あなたが使いたいフォーマット指定子です｡
そしてまた､ 他のものと同じように､ アドレスにアンパサンドを使って､
xと言うのです｡
というように､ 具体的にダブルで読み込む方法です｡
そしてそれは､ 流れで読むのとはまた違う｡
だから､ このことを頭の片隅に置いておいてください｡
これを実行に移すと､ かなり素直に動作していることがわかると思います｡
そして､ ダブルを読むインプットを読むことができます｡
だから､ それをそのまま実行すればいいんです｡
それで､ 2倍を要求されるわけですが､ 私はあまりやっていないんです｡
そして､ この2倍は77のようなものです｡ 8 して､ それを読み込んで保存する､ とても簡単なことです｡
ですから､ 先ほど申し上げたようにscanfは非常に便利です｡
その他､ コースを進めていくと､ scanfがうまく機能しないことがあることに気がつくと思います｡
f get sは他のものにも使えます｡
scanfの主な問題は､ 読み込むときに､ スペースが見えるまでしか読み込まないことです｡
それで､ scanfを使おうとすると､ 関数の中で何度も呼び出そうとするんですね｡
他の組み合わせでは､ キーボードのリターンボタンを押しても､
リターンボタンが読み込まれないからです｡
それで､ 改行ができなくなるんです｡
だから､ 次にscanfを使うときは､ その行をすぐにスキップして､
改行で読み込むことになるんだ｡
で､ これは一つのプログラムの中で複数のscanfsを次々と書いていくと､
改行で読んでいるために他のscanfsが実行されないことに気づく問題です｡
これを回避する非常に簡単な方法は､ scanfを実行した直後にgit
charを呼び出して､ それから別のスキャナを呼び出すことです｡
これは､ scanfを使ってdoubleで読み込むときは､ 必ずパーセントLFを使うということを示しただけです｡
また､ 私たちの課題の中には､ 便利なことをしたり､ さまざまな概念を学んだりするために､
ユーザーからの入力を得られるようにするものがありますから､
これも便利です｡
というわけで､ お役に立てたでしょうか｡
また､ 変数や文字列など､ 理解しきれていない概念もありますが､
心配しないでください､ これから詳しく説明します､ ありがとうございました｡