スピーカ1:それでは見てみましょう CS50の図書館で、 特にそのGetIntで機能。 ここでは、実際のソースを持っている GetIntでのコード。 そして、それは長すぎるではないことに注意し、 そのほとんどは、whileループを構成している - その時点で無限ループ - それだけで 我々は、実際にしたら値を返します 私たちが期待したもの頂いております。 のは、それを見てみましょう。 、最初にここまで注目してください ループが開始されている間。 我々は、コードの行を持って、次のことに注意してください それは実際にGetStringメソッドを呼び出し、 そして、戻り値を格納 変数、文字列型で、ラインと呼ばれる。 それから、健全性チェックのビットを行う。 ライン== NULLの場合には、我々不思議なことに INT_MAXを返します。 今ではINT_MAXであることが判明 特別な定数は、他の場所で宣言された つまり、可能な限り最大を指定 あなたは表すことができ、INT このようなプログラム。 今、私たちは自由に戻すことにしました のセンチネル値としてINT_MAX 種類、我々は予約してきた1 エラーを意味して発生しました。 だから我々が支払う価格は、当然のことながら、ある GetIntでは明らかにできないことを 実際と同じ大きさの数を返す INT_MAX、それが望んでいる場合であってもいるので、 その戻り値は、実際にすべき 呼び出し側によって解釈される - 誰がGetIntでを使用している - ある種のエラーなど。 次に、私が宣言したことに気付く int型のnとchar cを。 このコードは次の行では、私が呼ぶ sscanf関数と呼ばれる関数に渡す 4引数。 文字列である行は、ユーザーの タイプ入力フォーマットであり、 "%Iの%のC」 私は、ユーザーのマイトを期待していた文字列 のアドレスが続き型、 nは、およびcのアドレス。 今の生活の中でのsscanfの目的は確かである 探している文字列をスキャンする 特定のフォーマット、そのプログラマ その第二引数として指定されています。 この場合、%iはである 、%cが存在する限り。 だから、sscanf関数はint型に遭遇した場合 intが格納されることをユーザの入力、 Nと呼ばれる変数の内部理由 我々は第三として提供してきた Nのアドレスをはsscanfの引数。 これはsscanf関数が実際に行くことができることを意味します そこに、そこに値を更新します。 今、ユーザーがケース内 もっと何か中 1以上の数字より - つまり、ある種のCHAR - その第二の変数cは、アドレスが 我々は、その第四としてのsscanfに渡さ 引数には、設定されます。 今のチェック逆さま 利用者からの追加の文字がある その彼または彼女が協力しない場合、 ちょうどint型よりも多くの型、 我々はこの中でそれを検出することができるでしょう ようにして、その場合、sscanfは理由 意味、2を返すために起こっていること プレースホルダの両方を満たした 値を持つ。 しかし、我々は代わりにそのsscanf関数を期待している ユーザーだけを意味し、1を返します。 int型を提供した。 sscanfはあれば、我々は何をしますか 確かに1を返します。? さて、私たちはすぐにそのラインを解放 ユーザーがタイプ入力してから、我々 すぐに戻りN有する int型を頂いております。 そうでなければ、sscanf関数は1を返し、ない場合には したがって、ユーザは、協力していなかった、 我々はまだラインを解放するが、私たち 今再試行するようにユーザに促す。 そして、我々は、その内部にまだだから そうでなければ、無限ループ、プロセス 再開、そしておそらく再び、となります 多分もう一度、ユーザーまで、実際に 私たちにint型が用意されています。