[Powered by Google Translate] [週5] [デビッド·J·マラン - ハーバード大学] [これはCS50です。 - CS50.TV] これは、CS50、週5です。 今日、今週​​、我々は、科学捜査の世界を少しご紹介 問題の文脈で4を設定します。 ここで特別なイベントがその後そこだから今日は短縮された講義となります。 だから我々は覗いてみることにしましょう​​、今日学生や両親をいじめる 地平線上にあるいくつかのものを持つ。 その中でも、月曜日の時点では、さらにいくつかのクラスメートを持つことになります。 EDX、オープンコースウェアおよび多くのためにハーバードとMITの新しいオンラインイニシアチブ、 来る月曜日つまり、月曜日にハーバード大学のキャンパス内に発射される あなたは、最後のカウントのように、追加の86000クラスメートになります CS50の講義とセクションと一緒に次のようになります誰 やチュートリアルと問題セット。 さらに、本研究の一部として、あなたはCS50、今CS50xの就任のクラスのメンバになります。 その一環として、今だけでなく、いくつかの五分五分があると理解できます。 学生の膨大な数のために、このための準備をするには、 、我々は108のTFとCAを持っているにもかかわらずことを言えば十分だろう 私たちは学生の80,000ヒット後、それは非常に最高の学生教師の比率ではありません。 我々は、手動で設定しますので、多くの問題を採点するつもりはない そう問題セットで今週導入は、CS50チェックされます アプライアンス内のコマンドラインユーティリティであることを行っている 後でこの週末にそれを更新したら、買ってあげること。 あなた自身のpsetでコマンド、check50を実行することができるでしょう、 そして、あなたのプログラムが正しいか、間違っているかどうかについて即座にフィードバックを得るだろう 我々が提供してきた様々な設計仕様に応じて。 問題セットの仕様ではこれについて。 CS50x同級生もこれを使用することになります。 問題セット4は、すべての科学捜査についてです そしてこのpsetには、実際にいくつか現実のものに触発されました それによって、私は大学院にいたとき、私はしばらくの間、抑留 ミドルセックス郡の地方検事のオフィスと法医学の仕事をして そのリードフォレンジック調査官を持つ。 私は数週間過去言及思うように何がこれは、額 、州警察や他の人が入ってくるであろうミサです 彼らは、ハードドライブ、CDやフロッピーディスクなどのような物事をオフにドロップします その後フォレンジック事務所の目標は把握することでした そこにあったか、または何らかの証拠はなかったかどうかを指定します。 これは、特別捜査ユニットだったので、ホワイトカラー犯罪だった。 それが犯罪の多くの厄介なソート、デジタルメディアのいくつかの種類を含むものであった。 それは多くの人々が言っ​​てメールを書いていないことを、 "私はそれをしなかった"ことが判明 だから、かなり頻繁に、これらのフォレンジック検索は、すべてのその多くの実を上げていなかった 時には人々はそのようなメールを書くでしょう。 だから時々、努力が報われた。 しかし、この法医学のpsetに至るまでに、我々はpset4でグラフィックのビットを導入することになります。 このごろ - JPEGファイル、GIFファイルなど - あなたはおそらく当たり前のこれらの事を取る。 しかし、あなたが本当に考えてみれば、イメージ、はるかにロブの顔のような、 ドットまたはピクセルのシーケンスとしてモデル化することができます。 ロブの顔の場合には、色のすべての種類が、あります そして我々は、そうでない場合はピクセルと呼ばれる個々のドットを、見始め かつて我々はズームインし始め しかし、我々は世界を少し簡略化し、ただ、これはここで黒と白でロブであると言うならば、 白と黒を表現するために、我々は単なるバイナリを使用することができます。 我々はバイナリ、1または0を使用するつもりなら、私達はこれと同じ画像を表現することができます このビットのパターンを持つロブの笑顔の。 11000011は、白、白、黒、黒、黒、黒、白、白を表します。 そしてそれは、色鮮やかな写真の話を開始するために、次に大きな飛躍ではありません あなたがFacebook上で見たり、デジタルカメラで撮影したいという事。 しかし、確かにそれは色に来るとき、あなたはより多くのビットを必要としています。 や写真の世界では非常に一般的ではなく、1ビットカラーを使用することです このように示唆しているが、実際に数百万色を取得し、24ビットカラー、。 だから我々はロブの目にズームイン場合のように、 それはまた別のカラフルな可能性の数百万の任意の数であった。 だから我々は、チュートリアルで同様に4を設定して問題でこれを紹介します なぜならここで金曜日の講演のいつもの2時30分の代わりに3:30に今日される。 しかし、ビデオは明日いつものようにオンラインになります。 我々はまた、別のファイル形式をご紹介します。 これは意図的に、最初は威圧的に見えることを意図している しかし、これはC言語の構造体のためのちょうどいくつかのドキュメントです。 これは、Microsoftの年前に、このフォーマットの普及を助けていることが判明 ビットマップファイル形式は、BMP、これは超シンプルでカラフルなグラフィカルなファイル形式だったと呼ばれる それはかなりの時間のために使用され、時には、まだデスクトップの壁紙用にしました。 あなたは、Windows XPとなだらかな丘と青空に戻ってと思われる場合は、 それは一般的にbmpまたはビットマップイメージでした。 彼らはもう少し複雑さを持っているので、ビットマップは、私たちにとって楽しいです。 それは0と1のこのグリッドとしてはかなり簡単ではない。 代わりに、ファイルの先頭にヘッダのようなものを持っている。 だから、他の言葉で、内部のbmpファイルの、0と1の全体の束である しかし、そこにいくつかの追加の0と1があります。 そして、それは何年も前から当たり前の我々は、おそらく撮影したことが判明 - 。docまたは。xlsファイルやMP3、のMP4などのファイル形式、どんなファイル形式 あなたが精通していること - それも、ファイル形式であることが何を意味するのでしょうか 一日の終わりにこれらのファイルのすべては、我々だけで、0と1を持って使用しているからです。 そして、おそらくそれらは0と1のASCIIを通じて、ABC等を表す しかし、一日の終わりに、それはまだちょうど0と1です。 だから、人間はただ時折新しいファイル形式を発明することを決定 彼らはどこのビットパターンが実際に意味するものを標準化しています。 そしてこの場合にはここで、ビットマップファイル形式を設計した人々 そのビットマップファイルの非常に最初のバイトでは、オフセットが0で示すように、言った bfTypeと呼ばれるいくつかの暗号のような名前の変数があるように起こっている、 ただビットマップファイルの種類を表している、ビットマップファイルの種類はこれです。 あなたはオフセット2番目の行から、おそらく推測することができ、バイト数は2、 何を表して、0と1のパターンを持っている?何かのサイズ。 そして、そこから上に行く。 だから問題セット4に、あなたはこれらの事のいくつかを歩いたことでしょう。 我々はそれらのすべてを気になってしまうことはありません。 しかし、それはバイト54の周り面白くなって開始に気づく:rgbtBlue、緑、および赤。 あなたが今まで聞いたことがある場合頭字語のRGB - 赤、緑、青 - これはそれへの参照です それは結局のためには、虹のすべての色をペイントすることができます 赤と青と緑のいくつかの組み合わせを持つ。 そして、実際には、部屋の中で親が早いプロジェクターのいくつかを思い出すかもしれない。 これらの日、あなたはただ、一つの明るい光がレンズから出て来るのを見る しかし、戻って一日では、赤レンズ、青レンズ、緑のレンズを持っていた と一緒に、彼らは画面を目的とした、カラフルな画像を形成した。 そして、かなり頻繁に、中学校と高校はこれらのレンズを持っているでしょう ほんの少し傾いているので、ダブル、トリプルの画像を見ての一種だった。 しかし、それはアイデアだった。あなたは絵を描いて、赤と緑と青の光を持っていた。 そして、その同じ原理をコンピュータで使用されています。 だから問題セット4のあなたのためのその後の課題のうちいくつかのものになるだろうしている。 一つは、実際には0と1のパターンで取るために、画像のサイズを変更することである 、0と1の塊がこのような構造で何を表しているかを把握 赤、青、緑 - そして、ピクセルを複製する方法を見つけ出す - 内側になるように絵が最初にこのように見えたとき、 それは、その後、代わりに次のようになります。 あまりにもあなたがフォレンジックイメージを手渡されるだろうことになるだろう他の課題のうち、 デジタルカメラからの実際のファイルの。 そして、そのカメラで、かつては写真の全体の束だった。 問題は、我々は誤って消去するか、またはイメージが何らかの理由で破損していたされています。 悪い事は、デジタルカメラで発生。 そして、我々はすぐにあなたのために、そのカードの0と1をオフをすべてコピーし、 セット4つの大きなファイルにそれらをすべて保存してから、私たちは問題にあなたにそれらを渡します ので、理想的には、それらのJPEGファイルのすべてを回復させると、C言語でプログラムを書くことができます。 そしてそれは彼らが多少複雑なファイル形式のいるにもかかわらず、そのJPEGを判明 - 彼らははるかに複雑なここでこの笑顔だより - それはすべてJPEGは0と1の同じパターンで始まっていることが判明した。 だから、最終的には、ループまたは類似のために、whileループまたは使用して、 あなたは、このフォレンジックイメージ内のすべての0と1を反復処理することができます とすると、問題のセット仕様で定義されている特殊なパターンを見るたびに、 あなたは、非常に高い確率で、JPEGのスタートですここで想定することができます。 バイト数とするとすぐに同じパターンを見つけるように、いくつかの数 またはキロバイトまたはメガバイト後で、あなたがここに仮定することができ、第二JPEGです 私は最初の1の後に撮った写真。 私はそのファイルを最初に読むのをやめましょう、この新しいものを書き始める とpset4のためのあなたのプログラムの出力は、最大50のJPEGファイルであることを行っている。 それが50 JPEGファイルではない場合や、ループのビットを持っている。 あなたはJPEGファイルの数を無限に持っている場合は、無限ループを持っています。 だから、それはあまりにも非常に一般的なケースとなります。 だからそれは地平線上にあるものだ。 、常に両方に満足している人々が存在することを私のメールにつき実現する、私達の後ろ0クイズ 中立、クイズの周り悲しい0時間のソート。 と頭TF Zamyla、独自のTF、私に手を差し伸べるようにしてください あなたは物事が行った方法を議論したい場合は、あなたが知っているCAのうちの一つであるか。 だから部屋で両親を感動させる、CS50ライブラリは何ですか? [笑い]グッドジョブ。 CS50ライブラリとは何ですか?うん。 >> [生徒]それは[聞こえない]コードのあらかじめ記述されたセットです さて、良い。 それは、我々スタッフが書いたコードのあらかじめ記述されたセットです、私たちは、あなたに提供する それは、いくつかの一般的な機能を提供し、 ここに記載されている機能のすべて - 私に文字列を取得するようなものは、私にint型を取得します。 今から我々は実際にこれらの補助輪を脱いで開始します。 私たちはあなたから文字列を奪うために開始するつもりだ、 そのリコールは、まさに実際のデータ·タイプの同義語だったのですか? >> [複数の学生]はchar *。 char *型。両親のために、それはおそらく[なるシューという音]であった。それは良いことだ。 char *で我々は、我々の語彙から文字列を削除するとすべてのそれ以上のスクリーン上で見ることから始めましょう 実際にコードを書くことに来る少なくともとき。 同様に、我々ははるかにこれらの機能のいくつかを使用して停止します 我々のプログラムは、より洗練され得ようとしているからです。 だけではなく、プロンプトが点滅してそこに座ってプログラムを書く で何かを入力するように、ユーザーを待って、あなたは他の場所からの入力を取得します。 たとえば、ローカルのハードドライブ上、一連のビットからそれらを得るでしょう。 かわりに、ネットワーク接続から将来的にそれらを買ってあげる どこかのウェブサイト。 だから初めてこの層バックはがしてみましょうとCS50アプライアンスをプルアップ あなたは#何週間も含めてきたcs50.hと呼ばれ、このファイルを、 しかし、ここでは実際にこれの中身を見てみましょう。 青色でファイルの先頭にはコメントだけの全体の束です: 保証情報とライセンス。 これは、ソフトウェアの共通のパラダイムの一種である ソフトウェアの多くは、これらの日は、オープンソースと呼ばれるものであるため、 これは、誰かがコードを書いて、それが自由に利用できるようになったことを意味します だけではなく、実行すると使用することが、実際に読んで、変えると自分の仕事に統合する。 だから、それはあなたが非常に小さい形ではあるが、オープンソースソフトウェアを使用してきたものだ。 私はコメントを過ぎて下にスクロールすると、しかし、我々はいくつかのより身近なものを見ることから始めましょう。 cs50.hファイルはヘッダファイルの全体の束が含まれていることをここで一番上にあることに注目してください。 これらのほとんどは、我々は前に見ていないが、1は精通している。 これらのうちどれが、我々はこれまで、簡単にではあるが、見たことがありますか? >> [生徒]標準ライブラリ。 うん、標準ライブラリ。 stdlib.hは、malloc関数を持っています。 かつて我々は、動的メモリ割り当てについて話し始め 我々も来週に戻ってくるその、我々は、そのファイルを含む開始。 それはboolとtrueとfalseは実際にC自体には存在しないことが判明 あなたはここで、このファイルをインクルードする場合は除きます。 我々は数週間stdbool.hを含むされている ので、あなたはbool、trueまたはfalseの概念を使用することができます。 これがなければ、偽のそれからソートし、intを使用しなければならないでしょう とだけ任意に0がfalse、1がtrueであることを前提としています。 我々はさらに下にスクロールすると、ここに文字列の私達の定義である。 それは、この星がどこにあるか本当に問題ではないことを、我々は前に言ったように、判明した。 あなたも、すべての周りの空間を持つことができます。 我々はこの学期を明確にするために、このようにそれを推進してきました 星は型に関係していること、 もう少し一般的ではありませんしかし、もし、同じように一般的な実現 そこにそれを置くことですが、機能的には同じことだ。 我々はさらに下読めば、しかし、今、のは場合、getIntを見てみましょう 我々は何この学期を前に、おそらく最初に使用するためです。 ここでgetIntはある。これは何ですか? >> [生徒]プロトタイプ。 >>これはただのプロトタイプです。 多くの場合、我々は、我々のcファイルのてっぺんでプロトタイプを入れている しかし、あなたはまた、ヘッダファイルでプロトタイプを置くことができますここでこのようなhファイルには、 ので、あなたは他の人が使用できるようにしたいいくつかの関数を記述するときに、 これは、正確にCS50ライブラリの場合と あなたは、cs50.cのようなもので自分の関数を実装していないだけ あなたもいないそのファイルの先頭に、ヘッダファイルの先頭にプロトタイプを置く。 次に、ヘッダーファイルは友人や同僚が含まれるものであること と#は独自のコードに含まれています。 だから、すべてのこの時間は、あなたがこれらのプロトタイプのすべてを含めてきたが​​、 効果的にあなたのファイルの先頭にあるが、これは、#includeメカニズムを介して、 その本質的にコピーして、あなた自身にこのファイルを貼り付けます。 ここではいくつかのかなり詳細な資料になります。 場合、getIntはintを取得することを当然のことと私たちはかなり撮影した、 それはいくつかのコーナーケースがありますが判明した。 何京、あまりにも大きいの数のユーザーがタイプであれば、 それはただのint型の内側に収まることができないのですか?予想される動作とは何ですか? 理想的には、それは予測可能です。 したがって、このケースでは、実際には、細かい活字を読む場合 あなたが実際にその行を読み取ることができない場合は、この返しINT_MAXが表示されます。 我々はこのことについて話したが、その総額に基づいたことがない、それはおそらく、何ですか? [学生]は定数。 >>それは定数です。 それはおそらく、これらのヘッダーファイルのいずれかで宣言されているいくつかの特殊な定数です 、ファイル内でより高いことだし、INT_MAXはおそらくほぼ20億のようなものです 我々は何とかしてその何かを意味する必要があるため、という考えは間違っていた、 与えるか、または取る、20億までに-2000000000:我々は、はい、私達の処分で40億番号を持っています。 さて、どのようなプログラミングでは一般的であることは、あなたがちょうどそれらのいずれかの番号を盗むです 多分多分0、多分2億円、-2000000000、 あなたは世界にコミットできるようので、あなたの可能な値の1を過ごす 何かがうまくいかない場合に、私はこの極度の大きい値を返します。 しかし、あなたは、ユーザーが234のような不可解な何かを入力したくない...、本当に大きな数。 あなたは、定数として代わりにそれを一般化する。 だから本当に、あなたが過去数週間肛門されていた場合は、場合、getInt呼ばいつでも、 あなたはINT_MAXの条件がなかった場合は、ユーザーのタイプに確認されている必要があり、 または、より具体的には、それがなかった場合ので、場合、getIntリターンINT_MAXをした、 それは、実際に彼らはそれを入力しなかったことを意味します。何かは、このケースではうまくいかなかった。 だから、これは一般的に、単に特別な意味センチネル値、として知られているものです。 今cファイルに変身してみましょう。 Cファイルはいくつかの時間のためのアプライアンスに存在しています。 そして、実際には、アプライアンスが、それは、我々は、オブジェクト·コードと呼ばれるものにするために事前にコンパイルされている システムは知っているので、それがどこにあるが、それだけであなたには関係ありません この場合、それはどこにある:アプライアンス。 すべてのこの時間をgetIntおよび場合、getIntが取り組んできたかを見るために今までスクロールダウンしてみましょう。 ここでは、以前から同様のコメントがあります。 私はちょうどコード部分にズームインすることができます。 そして、私たちが持っている場合、getIntため以下の通りです。 それは入力を取りません。 、それは(真)中に、intを返しますので、我々は意図的に無限ループを持っている しかし、おそらく、我々は何らかの形でこのから抜け出すか、この内から戻ります。 これがどのように機能するかを見てみましょう。 我々は166、ループ内でこの最初の行にGetStringを使用するように見える。 どのような状況下でGetStringメソッドが返す可能性があるので、これは今は良い習慣です 特殊なキーワードNULL? >> [生徒]何か間違っている場合。 何かが間違っている場合。そして、あなたがGetStringメソッドのようなものを呼び出したときに間違って行くことができるか? うん。 >> [生徒] mallocがそれをint型を与えるために失敗します。 うん。たぶんmallocが失敗します。 どこかのフードの下には、GetStringはメモリを割り当てmallocを、呼んでいる これは、文字のすべてのコンピュータストアをすることができます そのキーボードにユーザーがタイプ。 そして、例えば、ユーザが自由時間の全体の多くを持っていたし、それ以上の入力したと仮定 コンピュータより多くの文字、2億文字よりもRAMを内蔵しています。 GetStringメソッドは、あなたにそれを示すことができなければなりません。 これは、超、超珍しいコーナーケースであっても、 それは、何らかの形でこれを扱うことができなければなりません 我々は戻って、そのドキュメントを読む場合などGetStringメソッド、実際の戻り値がNULLでない。 GetStringメソッドがNULLを返すことによって、失敗した場合、だから今、getIntはINT_MAXを返して失敗しようとしている ちょうどセンチネルとして。これらは、ちょうど人間の慣習です。 あなたはこのような場合は知っているだろう唯一の方法は、ドキュメントを読んでいます。 intは実際に頂いている場所までスクロールダウンしてみましょう。 私はもう少し下にスクロールすると、ライン170で、我々はこれらの行上記のコメントを持っています。 我々は172でint n、およびchar型、c、および、この新しい関数を宣言する そのあなた方のうちの何人かは、sscanf関数の前に偶然見つけました。 これは、文字列のscanfの略です。 言い換えれば、私に文字列を与えると私は、関心のある情報の断片のためにそれをスキャンします。 どういう意味ですか? 私はキーボードで、文字通りに123を入力し、Enterキーを打っていると仮定します。 GetStringメソッドによって返された123のデータ型は何ですか? >> [生徒]文字列。 それは右、明らかに文字列ですか?私は、文字列を得た。 だから123はそれの終わりに\ 0で、俗に言う、本当に123です。 つまり、int型ではありません。それは数字ではありません。これは、数字のように見えますが、実際にはありません。 だから何getIntはしなければならないのでしょうか? 123 \ 0 - - それは左から右へと、その文字列をスキャンしていると何とか実際の整数に変換します。 あなたがこれを行う方法を見つけ出すことができます。 あなたはpset2に戻ってと思われる場合は、おそらくシーザーと少し快適になった またはVigenereので、文字列を反復処理することができます、あなたはintに文字を変換することができます。 しかし、一体、それは仕事の全体の多くのです。 なぜあなたのためにそれを行いますsscanf関数のような関数を呼び出しませんか? このケースではラインと呼ばれる、文字列です - のでsscanfは引数を期待します。 次に、あなたがこの文字列に表示されるはず何、printf関数と非常によく似て、引用符で囲んで指定します。 と私がここで言ったんだけど、私は多分進数と文字を参照してくださいと思っているものです。 これはただの一瞬でその理由と我々が表示されます。 そしてそれは、この表記法は、我々が話を始め今のものを彷彿とさせることが判明 ちょうど一週間以上前。 &nと&Cここで私たちのためにやっては何ですか? >> [生徒] nのアドレスとcのアドレス。 うん。それは私にcのnとアドレスのアドレスを与えている。なぜそれが重要なのでしょうか? あなたは、Cの関数で、あなたは常にすべての値または値を返すことができることを知っています。 あなたは、int、文字列型、float型、char型、何か、あなたはvoidを返すことができますが、返すことができます しかし、あなたは唯一最大限に一つのことを返すことができます。 しかし、ここではsscanfが多分int型、10進数を私に返すようにしたい また、char型、そしてなぜ瞬間のchar私が説明しましょう​​。 あなたが効果的にsscanfは二つのことを返すようにしたいが、それはCでだけ可能ではありません あなたは、2つのアドレスを渡すことによって、その回避することができます なぜならできるだけ早くあなたが関数に二つのアドレスを渡すと、 その関数は彼らと何ができるのでしょうか? >> [生徒]それらのアドレスに書き込みます。 それは、それらのアドレスに書き込むことができます。 あなたはスター操作を使用し、それらのアドレスのそれぞれに、そこに行くことができます。 それがこのバックドア機構の一種が、非常に一般的な変数の値を変更するための このケースでは、2 - 1か所だけ以上。 今私は== 1をチェックしてから、それは、実際には、trueと評価されない場合は、nを返すよ気づく。 だから何が起こっているのですか?技術的には、我々は本当に場合、getIntで発生するすべてのはこれです。 俗に言う123 - 私たちは、いわば、解析したい、我々は文字列を読み込みたい - そして数は我々がしなければならsscanf関数を言っているのか、そこがあるように見える場合 私のためにこの変数nに - 123 - その数字を入れています。 それではどうして私は実際にこれは、同様にありましたか? あなたもここに文字を得るかもしれないと言ってsscanfの役割は何ですか? [聞こえない学生の応答は] >>小数点実際に動作することができます。 しばらく考えているのが保持しましょう​​。他に何が? [学生]は、NULLである可能性があります。 >>良いと思った。それがヌル文字である可能性があります。 それは、このケースでは実際にはありません。うん。 >> [生徒]アスキー。 アスキー。または私はさらに一般化することができます。 そこ%cは単にエラーチェックのためのものです。 私たちは、数字の後に文字があるようにしたくない しかし、何これは私が行うことができます以下の通りです。 それはsscanfは、ここに、この例ではnとcの値を格納する以外に、判明 それはまた、変数の数を返しているそれは何インチの値を入力する あなただけの123に入力した場合、そうだとすれば、唯一の%dが一致しようとしている、 とだけnは、123のような値で保存される そして、何もCに入れて傷つきません。 Cは、いわば、ゴミ値のまま - それはいくつかの値に初期化されたことがないているのでゴミ。 私は、これらのポインタの1を移入ので、だからその場合、sscanfは1を返します。 偉大な、その場合、私はラインがメモリを解放する解放するようにint型を持っている そのGetStringメソッドは、実際に割り当てられたし、私は、nを返す 他にその文を再試行してくださいどこにあなたが今まで疑問に思った場合は、から来ている、それはまさにここから来ている。 そうだとすればこれとは対照的に、私は123fooに入力 - テキストのほんのいくつかのランダムシーケンス - sscanfは、数値、数値、数値、fを、見に行くされている それがnに123を置くために起こっている、それはcでfを入れて、2を返すために起こっている。 だから我々はちょうどsscanf関数の振る舞い​​、非常に単純な方法の基本的な定義を使用して、持っている - よく、一目見ただけではなくその日はかなり単純な機構の終わりに複雑な - 言うのがあるintであり、そうだとすれば、それは私が見つけた唯一のことなのですか? そして、ここの空白は意図的なものだ。 あなたはsscanf関数のドキュメントを読めば、それはあなたが空白の部分が含まれている場合があることを伝えます 先頭または末尾に、sscanfはあまりにも、どんな理由であれ、ユーザーを許可します スペースバー123をヒットすると、それが正当であろう。 彼らは、スペースバーを叩くという理由だけでは、ユーザー怒鳴らないでしょう ほんの少し、よりユーザーフレンドリーな先頭または末尾にある。 場合、getIntで次に何か質問はありますか?うん。 >> [生徒]あなただけのchar型に入れたら? 良い質問です。 何がちょうどfのようなchar型で入力し、これまで123を入力せずにEnterを叩いたら? あなたは、このコード行の振る舞い​​は次のようになりますどう思いますか? [聞き取れない生徒の応答] その場合には、それはNまたはCを埋めるために行くわけではないので、ええ、そうsscanfは、あまりにもカバーすることができます。 その代わり、私もそのシナリオをキャッチしています、その場合に0を返すために起こっている 私が欲しいの期待値が1であるため。 私だけ充填される1つだけの事をしたい。良い質問です。 その他?かしこまりました。 ここでのすべての機能を通過するのをやめましょう、 しかし、残りの関心多分思われるものはgetStringで それはGetLongLong、getFloatは、場合、getIntは、getDoubleはことが判明しているため すべてのパントGetStringメソッドにそれらの機能がたくさん。 それでは、彼はここでどのように実装されるかを見てみましょう。 この1つは少し複雑に見えますが、それは同じファンダメンタルズを使用しています 我々は先週の話を始めた。 GetStringメソッドでは、これはここまでボイドに従って引数をとりません そしてそれは私が明らかにバッファと呼ばれる文字列を宣言するのですが、文字列を返します。 私は本当にそれがまだのために使用されるように何が起こっているのかわからないが、我々が表示されます。 容量はデフォルトは0であるように見えます。 これはnがまだのために使用されようとしているのかわからない、どこに行っているか全くわからない、 しかし、今ではもう少し面白くなってきている。 ライン243で、我々は、int、cを宣言します。 これは愚かなディテールの一種である。 charは8ビットであり、8ビットがどのように多くの異なる値を格納できますか? >> [学生] 256。 >> 256。 あなたがそこにいる256種類のASCII文字を使用したい場合の問題は、 あなたが戻って思えば - これは暗記するものではありません。 あなたはその大きなASCIIチャートに戻ってと思われる場合しかし、我々は数週間前にあったが、 128または256のASCII文字は、その場合にはあった。 我々は、0と1までの全てのパターンを使用していました。 あなたがエラーを検出することができるようにしたい場合は、それが問題だ あなたはすでにあなたの文字のために256の値を使用している場合ので、 今あなたが言っ手段を持っていないため、あなたは本当に、事前に計画を立てていなかった これは合法的な文字ではありません、これはいくつかの誤ったメッセージです。 それでは世界が行うことは、彼らが次の最大値は、intのようなものを使用している あなたは40億の可能な値に対して、ビット、32のクレイジーな数を持っているように、 あなたは単に、本質的に257それらを使うのをやめてしまうことができるように の1は、エラーのようないくつかの特別な意味を持っています。 それでは、どのようにこの作品を見てみましょう。 ライン246で、私は、fgetc関数を呼んでいるこの大きなwhileループを持っている fの意味はファイルなので、getcにしてから、標準入力。 それはこれがちょうどキーボードからの入力を読み取るというのがより正確な方法であると判明。 標準入力がキーボードを意味し、標準出力には、スクリーンを意味 そして我々はpset4でわかる標準誤差は、スクリーンを意味 しかし、それは実際の出力と画面の特別な部分を融合していないように あなたが印刷することを意図した。将来的にはその上が、より多くの。 だから、fgetcは、単にキーボードから1文字を読み、どこに保管して意味ですか? それをcに格納します。 その後チェック - ので、私はちょうどここにいくつかのブール論理積を使用している - それが等しくないことを確認してください - \ nは、ユーザが入力してヒットしている、我々はその時点で停止したい場合は、 ループの終了 - と我々はまた、特別な定数EOFをチェックしたい場合は、 あなたが知っているか推測した場合、それは何をどちらの略ですか?ファイルの>> [生徒]終了。ファイルの>>終わり。 私はキーボードで入力している場合ので、これは無意味なの一種である これに関与していないファイルは、実際にはありません しかし、これは単に意味するために使用される一般的な用語のようなものです その何もない、人間の指から来ています。 EOF - ファイルの終わり。 余談ですが、あなたがこれまでには至っていないだろうと、あなたのキーボードでコントロールDをしないヒットした場合 - あなたは、Ctrl + Cを打ちました - コントロールDは、この特別な定数と呼ばれるEOFを送ります。 だから今我々はいくつかの動的なメモリ割り当てを持っている。 そうだとすれば(N + 1>容量)。今、私はnを説明しましょう​​。 Nは、バッファ内で現在どれだけ多くのバイトです あなたは現在、ユーザーから構築していることを文字列。 あなたは、バッファの容量を持っているよりもあなたのバッファ内の多くの文字を持っている場合 直感的に私たちが次に何をする必要があるか、より多くの容量を割り当てています。 だから私はここに算数の一部を上に流し読みしてここでしかこの機能に集中するつもりです。 あなたは、malloc関数が何であるかを知っているか、少なくとも一般的によく知られている。 reallocは何をするかを推測するため。 >> [学生]は、メモリを追加します。 それは非常にメモリを追加するわけではありません。それは次のようにメモリを再割り当てします。 あなたにそのメモリをより多く与えるために文字列の末尾の余地はまだあるとすれば それはもともとあなたを与えるよりも、あなたはその追加のメモリを取得します。 それで、あなたはちょうど背中合わせにし、背中合わせに文字列の文字を入れておくことができます。 それがそうではない場合しかし、あなたはあまりにも長い間待っていたので、 とランダムな何かがあり、メモリにそのまま流してしまった しかし、余分なメモリがここにあり、それは大丈夫です。 reallocはあなたのためにすべての力仕事をやろうとすると、 あなたがこれまでここからで読んだ文字列を移動し、そこにそれを置く、 そして、その時点であなたにいくつかのより多くの滑走路を与える。 だから手を振って、私は何GetStringメソッドが何をしているとしましょう それは、小さなバッファで多分1つの文字を始めており、 2文字でユーザがタイプした場合と、GetStringメソッドは、呼び出しreallocをしてしまうと言う 1文字では十分ではありませんでした。私に2つの文字を与える。 あなたは、ループのロジックを通読したとすればそれから、それは言おうとしている 3文字で入力したユーザーが、今2を私に与えるものではないが、4文字、 その後、私に8を得、その後、私に16と32を与える。 私は能力を毎回倍増しているという事実 バッファはゆっくりと成長するつもりはないことを意味し、それは超高速の成長になるだろう。 そして、何がその利点になるのでしょうか? なぜ私は、バッファのサイズを倍増しています ユーザは単にキーボードから1余分な文字が必要な場合でも? [聞き取れない生徒の応答] >>これは何ですか? >> [生徒]あなたはできるだけ頻繁にそれを成長させる必要はありません。 その通りです。あなたは、しばしば、それを成長させる必要はありません。 そして、これはあなたがここにあなたの賭けをヘッジしているだけの種類ですが、 あなたはそれが遅くなる傾向があるため、reallocの多くを呼び出すにしたくないという考え。 あなたは、メモリ用のオペレーティングシステムを尋ねるいつでも あなたはすぐに将来の問題セットで説明するように、それはいくつかの時間がかかる傾向にある。 だから、あなたには、いくつかのスペースを無駄にしている場合であっても、その時間を最小限に抑える 良いことになる傾向がある。 しかし、我々はここでGetStringメソッドの最後の部分を通読したとすれば - そして再びここで一つ一つの行を理解することが、今日はそれほど重要ではありません - それが最終的に再びmalloc関数を呼び出していることがわかり それが文字列のために必要として、それは多くのバイトとまったく同じように割り当て フリー過度に大きなバッファを呼び出すことによって、その後捨てる それは確かにあまりにも多くの時間を倍増してしまった場合。 だから簡単に言えば、それがGetStringメソッドは、このすべての時間を働いている方法です。 すべてのそれは、何度も何度も、一度に1つの文字を読まれない それはいくつかの追加のメモリが必要になるたび、それはそれのためにオペレーティング·システムを尋ねる reallocを呼び出すことによって。 何か質問?かしこまりました。 攻撃。 今、私たちは、ポインタを理解するか、少なくともポインタを持つますます精通していること、 全世界が崩壊し始める方法を検討してみましょう あなたは非常に敵対的なユーザに対して防御しない場合、 お使いのシステムに侵入しようとしている人々、 いくつかのレジストレーションコードを回避することによって、ソフトウェアを盗もうとしている人 彼らはそうしないとインチ入力が必要になる場合がありますことを ここでは、この例を見てみましょう、下部の主な機能を持っているだけでCのコードである それは、関数fooを呼び出す。そして、何それはfooに渡しているか? [学生]単一の引数。 >> [マラン]単一の引数。 ユーザーは、コマンドラインで入力した最初の単語を意味だからargv [1]に、 a.outまたはものは何でもした後にプログラムが呼び出されます。 だから上部にあるfooはchar *型を取り込む。しかし、char *はちょうど何ですか? >> [生徒]文字列。 [マラン]文字列、何も新しいものはここにありませんので。 その文字列は任意にバーと呼ばれている。 この行では、ここではchar cを[12];半技術英語の並べ替えでは、この行は何をやっている? の>>配列 - 配列[学生]? >> [生徒]キャラクター。 >>文字。 私に12文字の配列を与える。だから我々は、このバッファと呼ぶかもしれない。 それは技術的にはCと呼ばれますが、プログラミングのバッファは単にスペースの束を意味している あなたはいくつかのものをインチ置くことができる それから最後に、memcpyを我々の前に使用されていませんでしたが、おそらくそれが何をするかを推測することができます。 これは、メモリをコピーします。それは何をしますか? どうやらこれは、cに、その入力、バーをコピーしますが、唯一のアップバーの長さになります。 しかし、ここでバグがあります。 >> [生徒]あなたは、sizeof文字を必要としています。オーケー。>> 技術的には、私たちは本当に(バー)*はsizeof(char型))をstrlenを行う必要があります。それは正しいです。 しかし、ここでは最悪の場合には、みましょうそれthat'sを想定 - オーケー。その後、2つのバグがあります。 だから、はsizeof(char型)); これは少し広い作ってみましょう。 だから今何かのバグが、まだあります? >> [聞こえない学生の応答] 何をチェックしますか? >> [学生]はNULLかどうかをチェックします。 悪いことが起こるので、我々は一般的にnullをチェックすべきである あなたはそこに行くに終わるかもしれないので、あなたのポインタがNULLの場合、 そしてあなたは今までスター演算子とそれを間接参照してNULLに行くべきではありません。 だからそれは良いことだ。そして、我々は他に何をやっている?論理的には、欠陥があまりにもここにあります。 [学生] argcが> =〜2であるかどうかをチェックします。 argcが> = 2であればそれで確認してください。さて、ここでこのプログラムの3つのバグがあります。 ユーザが実際のargv [1]に何を入力した場合我々は今チェックしています。グッド。 この三番目のバグは何ですか?うん。 >> [生徒] Cの大きさが十分ではないかもしれません。 グッド。我々は、1つのシナリオをチェックしました。 暗黙のうちにチェック私たちはバーの長さを超えてしまうよりも多くのメモリをコピーしないでください。 だから、文字列で入力した場合、ユーザが10文字の長さ、 これは10文字だけコピーを言っている。そして、それは大丈夫です。 ユーザが20文字の単語のようにプロンプ​​トに入力した単語が、どうでしょう? これは、20文字バーからのものにコピーを言っている? あなただけのデータを書いたことを意味しそうでなければ我々のバッファと呼ばれるC、A、 あなたが所有していない8バイトの場所に、 そしてあなたがそれらを割り当てられることはないという意味で、それらを所有していない。 だから、これは一般的にバッファオーバーフロー攻撃やバッファオーバーラン攻撃として知られているものです。 そして、それは、ユーザーまたはユーザーの関数を呼び出しているプログラムがあればという意味で攻撃だ 実際に実際には非常に悪いかもしれません次に何が起こるのか、悪意を持ってこれをやっている。 それでは、ここでこの絵を見てみましょう。 この画像は、メモリのスタックを表します。 関数を呼び出すたびにスタック上のこの小さなフレームを取得することを思い出してください その後、別の後、もう一つを。 そしてこれまで、我々はこれらの四角形としてだけの種類抽象化しました ボード上またはここに画面上のいずれか。 しかし、我々はあなたが関数fooを呼び出すときに、これらの矩形の一つにズームインした場合、 その四角形の中にそのフレームのスタック内部の詳細があることが判明 より我々はスワップの話でしたと同じように、xとyとaとb、。 これは、いくつかの低レベルの詳細は、返信先のアドレスが、中でもがあることが判明した。 メインは、fooを呼び出したときにだからそれは結局、メインは、fooを通知しなければならない 何をメインのアドレスをコンピュータのメモリ内にある そうしないとするので、できるだけ早くfooとして、ここでは、この場合のように、実行が終了 一度、fooの終わりにこの閉じ波括弧を達成 プログラムの制御が行くことになっている場所fooは一体どのようにして知るのでしょうか? それは、その質問への答えがここにこの赤い四角形の中にあることが判明した。 これは、ポインタを表し、それが一時的に格納するためにコンピュータにかかっている いわゆるスタック上でそのようにすぐにfooのようなメインのアドレスは、実行が終了すると、 コンピュータはどこに戻ってメインのどの行を知っています。 保存されたフレーム·ポインタは、これに同様に関する。 ここでのchar *バーは何を表して? 今ここにこの青セグメントは、fooのフレームです。バーとは何ですか? バーは単にfoo関数の引数である。 だから今我々は、おなじみの絵のようなものに戻っています。 画面上でより多くのものや、その他の気晴らしは、あります しかし、この水色のセグメントはちょうど私達が黒板に描いてきたものです スワップのような何かのために。それはfooのフレームです。 そしてその中に唯一のものは、今すぐこのパラメータであるバーです。 しかし、ほかに何かここでは、このコードに応じてスタックにあるべきですか? [学生] char cを[12]。 >> [マラン] char cを[12]。 我々はまた、cという変数に割り当てられたメモリの12乗が表示されるはずです と確かに我々は、画面上にそれを持っている。 この図のc [0]、その後、著者はそこにある非常にトップ 正方形のすべてを描く気にしますが、12は、そこに確かに存在していなかった なぜならあなたは右下を見れば、C [11]あなたは0から数えると12日、このようなバイトです。 しかし、ここが問題なのです。 どの方向にcが成長しているのか? トップダウンの並べ替え、それが一番上から開始して、下方に大きくなってしまった場合。 それはここにすべての私達が私達自身をはるかに滑走路を左のように見えない。 私達は種類の隅に自分自身を描いた、 とすることは、c [11]、[保存されたフレームポインタに対して右にあるバーに対して右にある これは、リターンアドレスに対して右のアップです。以上の余地はありません。 あなたが台無しにしそうだとすれば意味は、その後何 そしてあなたは、12バイトのバッファに20バイトを読んでみてください? どこでそれらの追加の8バイトは行くつもりですか? >> [生徒]インサイド - 他のすべての内部では、そのうちのいくつかは超重要です。 そして最も重要なことは、潜在的に、そこに赤いボックス、リターンアドレスです なぜなら、あなたはどちらかが誤ってまたはadversariallyそれらの4バイトが上書きされることを仮定する ゴミではなく番号を持つだけでなく、そのポインタアドレスは、 それは、メモリ内に実際のアドレスを表すために起こります。 論理的含意は、何ですか? >> [生徒]機能は、別の場所に戻るために起こっている。 その通りです。 ときにfooが戻ると中括弧、プログラムを続行しようとしていることをヒット メインに戻らない、それはその赤いボックスにあるもののアドレスに戻すために起こっている。 ソフトウェアの登録を回避する場合には、 に戻されているアドレスが正常に呼び出される関数である場合はどうでしょう 後には、ソフトウェアの代金を払った登録コードを入力してきた? あなたは、ここに行くのではなくここに上がっていませんだましのコンピュータを並べ替えることができます。 あなたが本当に賢いなら、または、敵は実際には、例えば、キーボードから入力することもできます はなく、実際の単語ではなく、20文字が、彼または彼女は、実際にタイプであるとし コー​​ドを表すいくつかの文字。 そして、それはCコードであることを行っていない、それは実際に文字になるだろう それは0と1のバイナリマシンコードを表しています。 しかし、彼らはそれを行うのに十分賢いと仮定している どうにかして、本質的に、コンパイルされたコードですGetStringメソッドプロンプト何かに貼り付けるには、 そして最後の4バイトには、そのリターンアドレスを上書きします。 そして、その入力は、どのようなアドレスをしますか? これは、実際にこの赤い四角形でバッファの先頭バイトのアドレスを格納します。 だから、あなたは本当に賢いことがあり、これはそこに悪い人のために多くの試行錯誤です しかし、あなたは、このバッファがどの程度の大き把握することができます 入力の最後の数バイトはプログラムに提供するよう あなたのバッファの先頭のアドレスに相当することが起こる、あなたはこれを行うことができます。 我々は通常、helloと\ 0と言うなら、それはバッファで終わるものだ。 しかし、我々はもっと巧妙なていると我々は我々が一般的に攻撃コードを呼んでいるもので、そのバッファを埋める場合 - AAA、攻撃、攻撃、攻撃 - これはちょうど悪い何かを何かである、 あなたが本当に賢いなら何が起こるか、あなたはこれを行うことがあります。 80、C0、35、08 - ここに赤いボックスに数字のシーケンスです。 それがここまでの番号と一致していることに注意してください。 それは逆の順序でですが、そのいくつかの他の時間について。 このリターンアドレスは故意に変更されていることに注意してください ここにアドレスを等しくなるように、メインのアドレスではなく。 悪者がスーパースマートがないような場合は、彼または彼女は、その攻撃コードに含めるとしている ユーザのすべてのファイルを削除したり、パスワードをコピーするようなもの 全く何の関係 - または私はその後にログインできるユーザアカウントを作成してください。 そして、これは危険とCの電力の両方です あなたは、ポインタを介して、メモリへのアクセスを持っているので、 そしてあなたは、したがって、コンピュータのメモリに必要な何かを書くことができます あなたは、コンピュータがあなたがしたいことは何でも作ることができる 単にそれが自分のメモリ空間内で飛び回る持っていることによって。 それで、この日に多くのプログラムや危険にさらされますので、多くのウェブサイトがそう これを活用して人々になるまで煮詰める。 そして、これは超洗練された攻撃のように思えるかもしれないが、それは常にそのように起動しません。 現実には、何が悪いの人は一般的に尽くすことであるということです それは、コマンドラインまたはGUIのプログラムやウェブサイトでのプログラムであるかどうか、 あなただけのナンセンスの提供を開始。 あなたは、検索フィールドに本当に大きなワードに入力し、Enterキーを打つ そしてあなたは、ウェブサイトがクラッシュした場合に参照するのを待つ またはプログラムは、いくつかのエラーメッセージを表示したときはを参照するのを待つ あなたが悪者のように幸運を得るとした場合には、いくつかのクレイジーな入力を提供するため、 つまり、プログラマがあなたの悪い行動を予想していなかったことを意味し、プログラムをクラッシュ これは、あなたが十分な努力、十分な裁判とエラーでおそらくできることを意味し、 より正確な攻撃を遂行する方法を見つけ出す。 セキュリティのために、多くの部分はちょうど完全に、これらの攻撃を回避されていません しかし、それらを検出して、実際にログを見る と狂気の入力があなたのウェブサイトに入力された人々を持っているものを見て、 どんな検索語があなたのウェブサイトに人々を入力した いくつかのバッファがオーバーフローした場合の期待インチ そして、このつまるところ配列に何のシンプルな基本に そして何でメモリを割り当てて使用することを意味しません。 その後、あまりにこれはに関連していた。 もう一度だけまだハードドライブの内部に一瞥してみましょう。 あなたは、あなたのごみ箱またはごみ箱にファイルをドラッグすると、その一週間か二週間前からリコール 何が起こるか? >> [生徒]ありません。 >>絶対に何も、右か? 最終的には、ディスク容量が不足する場合は、 WindowsやMac OSはあなたのためのファイルの削除が開始されます。 あなたはそこに何かをドラッグした場合しかし、それはすべて安全ではありません。 すべてのあなたのルームメイトや友人や家族がしなければならないことは、ダブルクリックすると、ほら、さ 削除しようとしたすべての大ざっぱなファイルがあります。 私たちのほとんどは、少なくとも、あなたは右クリックをクリックするか、コントロールしなければならないことを知っている やゴミまたはそのような何かを空にします。 しかし、それでもかなりのトリックをしようとしないこと あなたのハードドライブ上のファイルを持っているときに何が起こるので、 、それはいくつかのWord文書やJPEGの一部を表し、これは、あなたのハードドライブを表す としてみましょうここでは、このスライバーは、そのファイルを表すと言う そしてそれは0と1の全体の束で構成さている。 あなただけでなく、缶やごみ箱ごみ箱にそのファイルをドラッグしたときに何が起こる だけでなく、それを空にする?何の並べ替え。 それが今では絶対に何もしないではありません。 少し何かがこの表の形で行われるため、今ではただ何もない。 だから、コンピュータのメモリの内部データベースまたはテーブルのいくつかの種類があり それは本質的に、ファイルごとに1つの列の名前とファイルごとに1つの列 'の場所を持っている これはどこの場所123、ただの乱数かもしれない。 だから我々はx.jpegと位置123のような何かを持っているかもしれません。 あなたが実際にあなたのゴミ箱を空にすると次に何が起こる? 消えている。 しかし、どのようななくならないことは、0と1です。 だからpset4への接続は、次に何ですか? さて、pset4で、ちょうど我々は誤ってコンパクトフラッシュカードを消去してきたので、 これらの写真のすべてを持っていたか、それは不運によって破損したからといって、その 0と1が残っていないことを意味するものではありません。 何かが壊れてしまったので、たぶん、それらのいくつかは失われ いくつかの0が1秒になったと1が0になったという意味で。 バギーソフトウェアまたはハードウェアの欠陥のために悪いことが起こる可能性があります。 しかし、それらの100%であっても多分、これらのビットの多くがまだ残っている。 それはJPEG1が出発したところパソコンやカメラが知らないだけだ どこJPEG2が開始されました。 しかし、あなたならば、プログラマは、それらのJPEGファイルである精通のビットを知っている またはどのような彼らはあなたが0と1を分析して、JPEG、JPEGを言うことができるので、次のようになり、 あなたの仕事は、基本的にforやwhileループを使用してプログラムを書くことができます それは、それらのファイルのそれぞれを回復します。 レッスンは、その後しっかりとあなたのファイルの消去を開始することであるので、 あなたは完全にこの問題を回避したい場合。はい。 [学生]どのように来る、それはあなたのコンピュータ上で言う あなたは以前よりも多くのメモリを持っている? あなたが前にしたよりも多くのメモリを持っている - >>【学生】より利用可能なメモリ。 ああ。良い質問です。 それではどうしてゴミ箱を空にした後、コンピュータはあなたを教えてくれません あなたは以前よりも多くの空き容量があることを? 一言で言えば、それは嘘をついているからです。 より技術的に、あなたが今あなたが言っているので、より多くのスペースを持っている そのファイルは、かつて他のものを置くことができます。 しかし、それは、ビットが離れて行くという意味ではありません そしてそれは、ビットは、例えば、すべて0に変更されているという意味ではありません あなたの保護のため。 だからこれとは対照的に、ファイルを安全に消去するか、デバイスを物理的に破壊する場合、 それは本当にその周りに時々唯一の方法です。 では、なぜ我々はその半怖いノートに残していない、と我々は月曜日にお会いしましょう​​。 [拍手] [CS50.TV]