2 00:00:00,000 --> 00:00:01,860 >> スピーカ1:それでは見てみましょう CS50の図書館で、 3 00:00:01,860 --> 00:00:05,190 特にそのGetIntで機能。 4 00:00:05,190 --> 00:00:07,820 ここでは、実際のソースを持っている GetIntでのコード。 5 00:00:07,820 --> 00:00:12,050 そして、それは長すぎるではないことに注意し、 そのほとんどは、whileループを構成している - 6 00:00:12,050 --> 00:00:15,620 その時点で無限ループ - それだけで 我々は、実際にしたら値を返します 7 00:00:15,620 --> 00:00:17,400 私たちが期待したもの頂いております。 8 00:00:17,400 --> 00:00:18,700 のは、それを見てみましょう。 9 00:00:18,700 --> 00:00:21,650 >> 、最初にここまで注目してください ループが開始されている間。 10 00:00:21,650 --> 00:00:25,390 我々は、コードの行を持って、次のことに注意してください それは実際にGetStringメソッドを呼び出し、 11 00:00:25,390 --> 00:00:29,620 そして、戻り値を格納 変数、文字列型で、ラインと呼ばれる。 12 00:00:29,620 --> 00:00:31,210 それから、健全性チェックのビットを行う。 13 00:00:31,210 --> 00:00:35,770 ライン== NULLの場合には、我々不思議なことに INT_MAXを返します。 14 00:00:35,770 --> 00:00:40,140 >> 今ではINT_MAXであることが判明 特別な定数は、他の場所で宣言された 15 00:00:40,140 --> 00:00:44,030 つまり、可能な限り最大を指定 あなたは表すことができ、INT 16 00:00:44,030 --> 00:00:45,160 このようなプログラム。 17 00:00:45,160 --> 00:00:49,430 今、私たちは自由に戻すことにしました のセンチネル値としてINT_MAX 18 00:00:49,430 --> 00:00:53,120 種類、我々は予約してきた1 エラーを意味して発生しました。 19 00:00:53,120 --> 00:00:56,230 だから我々が支払う価格は、当然のことながら、ある GetIntでは明らかにできないことを 20 00:00:56,230 --> 00:01:01,440 実際と同じ大きさの数を返す INT_MAX、それが望んでいる場合であってもいるので、 21 00:01:01,440 --> 00:01:04,730 その戻り値は、実際にすべき 呼び出し側によって解釈される - 22 00:01:04,730 --> 00:01:06,260 誰がGetIntでを使用している - 23 00:01:06,260 --> 00:01:09,340 ある種のエラーなど。 24 00:01:09,340 --> 00:01:13,840 >> 次に、私が宣言したことに気付く int型のnとchar cを。 25 00:01:13,840 --> 00:01:18,030 このコードは次の行では、私が呼ぶ sscanf関数と呼ばれる関数に渡す 26 00:01:18,030 --> 00:01:18,970 4引数。 27 00:01:18,970 --> 00:01:25,110 文字列である行は、ユーザーの タイプ入力フォーマットであり、 "%Iの%のC」 28 00:01:25,110 --> 00:01:28,850 私は、ユーザーのマイトを期待していた文字列 のアドレスが続き型、 29 00:01:28,850 --> 00:01:30,920 nは、およびcのアドレス。 30 00:01:30,920 --> 00:01:34,860 今の生活の中でのsscanfの目的は確かである 探している文字列をスキャンする 31 00:01:34,860 --> 00:01:38,700 特定のフォーマット、そのプログラマ その第二引数として指定されています。 32 00:01:38,700 --> 00:01:42,020 この場合、%iはである 、%cが存在する限り。 33 00:01:42,020 --> 00:01:46,700 だから、sscanf関数はint型に遭遇した場合 intが格納されることをユーザの入力、 34 00:01:46,700 --> 00:01:50,270 Nと呼ばれる変数の内部理由 我々は第三として提供してきた 35 00:01:50,270 --> 00:01:52,810 Nのアドレスをはsscanfの引数。 36 00:01:52,810 --> 00:01:56,870 これはsscanf関数が実際に行くことができることを意味します そこに、そこに値を更新します。 37 00:01:56,870 --> 00:01:59,990 >> 今、ユーザーがケース内 もっと何か中 38 00:01:59,990 --> 00:02:01,220 1以上の数字より - 39 00:02:01,220 --> 00:02:03,570 つまり、ある種のCHAR - 40 00:02:03,570 --> 00:02:07,940 その第二の変数cは、アドレスが 我々は、その第四としてのsscanfに渡さ 41 00:02:07,940 --> 00:02:10,560 引数には、設定されます。 42 00:02:10,560 --> 00:02:14,220 今のチェック逆さま 利用者からの追加の文字がある 43 00:02:14,220 --> 00:02:17,360 その彼または彼女が協力しない場合、 ちょうどint型よりも多くの型、 44 00:02:17,360 --> 00:02:20,530 我々はこの中でそれを検出することができるでしょう ようにして、その場合、sscanfは理由 45 00:02:20,530 --> 00:02:24,860 意味、2を返すために起こっていること プレースホルダの両方を満たした 46 00:02:24,860 --> 00:02:25,600 値を持つ。 47 00:02:25,600 --> 00:02:30,360 しかし、我々は代わりにそのsscanf関数を期待している ユーザーだけを意味し、1を返します。 48 00:02:30,360 --> 00:02:31,630 int型を提供した。 49 00:02:31,630 --> 00:02:34,480 >> sscanfはあれば、我々は何をしますか 確かに1を返します。? 50 00:02:34,480 --> 00:02:39,150 さて、私たちはすぐにそのラインを解放 ユーザーがタイプ入力してから、我々 51 00:02:39,150 --> 00:02:42,670 すぐに戻りN有する int型を頂いております。 52 00:02:42,670 --> 00:02:47,180 そうでなければ、sscanf関数は1を返し、ない場合には したがって、ユーザは、協力していなかった、 53 00:02:47,180 --> 00:02:51,470 我々はまだラインを解放するが、私たち 今再試行するようにユーザに促す。 54 00:02:51,470 --> 00:02:55,390 そして、我々は、その内部にまだだから そうでなければ、無限ループ、プロセス 55 00:02:55,390 --> 00:03:00,190 再開、そしておそらく再び、となります 多分もう一度、ユーザーまで、実際に 56 00:03:00,190 --> 00:03:01,500 私たちにint型が用意されています。 57 00:03:01,500 --> 00:03:21,490