[MUSIC CHƠI] ROB Boden: Được rồi. Vì vậy, điều đầu tiên đầu tiên, video từ một gương mặt quen thuộc. [VIDEO XEM LẠI] -Được rồi. Đây là CS50, và đây là đầu tuần ba. Tôi xin lỗi tôi không thể có mặt với bạn ngày hôm nay, nhưng cho phép tôi giới thiệu Của Rob Boden CS50 của. [END phát lại video] [Vỗ tay và cổ vũ] ROB Boden: Các phim đã đóng trong video là tuyệt vời. Được rồi. Vì vậy, đầu tiên, có ăn trưa khác. Đó là vào ngày mai tại 01:15. Không có bữa ăn trưa vào thứ sáu này. Đó là với Quora. Và Tommy không có ở đây, nhưng một trong những người dân ở đó là cựu CF đầu, Tommy McWilliam. Vì vậy, anh ấy là một chàng trai vui vẻ. Bạn nên đến. Được rồi. Vì vậy, tuần trước, chúng tôi bắt đầu phá vỡ ngoài về những gì thực sự là một chuỗi. Chúng ta đã biết ngay từ đầu rằng đó là một chuỗi các ký tự. Nhưng tuần trước, chúng tôi đào sâu vào thực tế rằng những gì thực sự là một chuỗi các ký tự, tốt, bây giờ chúng ta có mảng các ký tự. Và chúng ta biết rằng một chuỗi, nó là một mảng của các nhân vật, vào cuối, chúng tôi có byte null đặc biệt này, điều này dấu gạch chéo ngược 0, cho biết cuối chuỗi. Và do đó, một chuỗi là một mảng nhân vật, nhưng chúng ta có thể có nhiều hơn chỉ là một mảng kí tự, chúng ta có thể có một mảng của bất kỳ loại điều chúng ta muốn. Vì vậy, nếu bạn nhớ lại từ tuần trước, Chương trình lứa tuổi mà David giới thiệu thực sự nhanh chóng. Điều đầu tiên để chúng ta sẽ làm là yêu cầu người dùng cho một số nguyên, số lượng người trong phòng. Một khi chúng ta có số nguyên, chúng ta đang khai báo một mảng. Chú ý cú pháp khung này. Bạn sẽ làm quen với điều đó. Vì vậy, chúng ta đang khai báo một mảng các số nguyên được gọi là lứa tuổi, và có n số nguyên trong mảng này. Vì vậy, mô hình này ngay tại đây, 4 int này i bằng 0, i nhỏ hơn n, tôi cộng cộng thêm, đó cũng sẽ là một mô hình mà bạn nhận được rất được sử dụng để. Bởi vì đó là khá nhiều như thế nào bạn luôn luôn lặp qua mảng. Vì vậy, hãy nhớ rằng n là chiều dài của mảng của chúng tôi. Và vì vậy ở đây, chúng tôi nhiều lần yêu cầu cho tuổi của người tôi trong phòng. Sau này, chúng tôi đi xuống, và cho bất cứ điều gì Lý do tùy ý, sau đó chúng tôi in ra bao nhiêu tuổi họ sẽ là một năm kể từ bây giờ. Và chạy chương trình đó, chúng ta hãy làm cho các lứa tuổi, lứa tuổi dot dấu gạch chéo. Vì vậy, số lượng người trong phòng, chúng ta hãy nói có ba. Và nói, người đầu tiên là 13, tiếp theo là 26, và cuối cùng là 30. Vì vậy, sau đó nó sẽ duyệt qua những ba người, in ra 14, 27, và 31. Vì vậy, hãy nhớ rằng khi chúng ta khai báo một mảng có kích thước n, các chỉ số trong đó mảng, mảng có giá trị và chỉ số 0, 1, 2, tất cả các cách đến n trừ đi 1. Vì vậy, khi chúng tôi cho biết đã có ba người trong phòng, và chúng tôi đặt tại đây phiên đầu tiên thông qua này vòng lặp, tôi sẽ là 0. Vì vậy, trong chỉ số 0. Chúng tôi đang giao đầu tiên tuổi người dùng nhập vào. Sau đó, trong phần tiếp theo, chúng ta đang bước vào thứ hai n người dùng nhập vào, và trong bên cạnh hai, n cuối cùng. Vì vậy, lưu ý rằng một mảng có kích thước ba không có bất cứ điều gì trong chỉ số ba. Đây không phải là hợp lệ. Được rồi. Vì vậy, sẽ trở lại đây. Vì vậy, bây giờ mà chúng tôi đã xử lý với mảng, chúng tôi có một số quen thuộc. Bây giờ chúng ta sẽ chuyển sang lệnh đối số dòng, mà sẽ được khá liên quan đến vấn đề thiết lập này. Vì vậy, cho đến bây giờ, bất cứ khi nào bạn đã tuyên bố chức năng chính của bạn, chúng tôi đã nói int void main. Vì vậy, khoảng trống chỉ có nghĩa là chúng ta không đi qua bất kỳ đối số cho chức năng này. Bây giờ chúng ta sẽ thấy chính có thể mất một đối số. Ở đây chúng tôi gọi họ là int argc và chuỗi dấu ngoặc argv. Khung, một lần nữa, cho thấy mà chúng ta đang đối phó với mảng. Vì vậy, ở đây, khung chuỗi argv, chúng tôi đối phó với một mảng của chuỗi. Vì vậy, argc, đó là sẽ chỉ ra bao nhiêu lý lẽ chúng tôi đã thông qua chương trình này. Và để xem những gì có nghĩa là, chúng ta hãy đóng cửa này. OK. Vì vậy, cho đến bây giờ, chúng tôi đã chạy mỗi chương trình như lứa tuổi dot dấu gạch chéo. Chúng tôi cũng có thể, tại dòng lệnh, qua truyền tham số, do đó kỳ hạn, lệnh đối số dòng. Vì vậy, tham số đầu tiên, xin chào thế giới. Vì vậy, ở đây, argc sẽ là ba. Đó là số của các đối số tại dòng lệnh. Argc luôn luôn là ít nhất 1, kể từ khi chấm cắt giảm các lứa tuổi, chính nó, được tính là một trong những các đối số dòng lệnh. Sau đó xin chào là lần đầu tiên. Nếu lứa tuổi dot dấu gạch chéo là thứ không, sau đó xin chào là lần đầu tiên, và thế giới là thứ hai đối số dòng lệnh. Vì vậy, các chuỗi argv, chúng ta sẽ thấy, chứa các chuỗi, dấu chấm dấu gạch chéo lứa tuổi, xin chào, và thế giới. Và, theo yêu cầu của David, chúng ta sẽ để chơi một đoạn video giới thiệu đó. [VIDEO XEM LẠI] -Cho đến bây giờ trong chương trình chúng tôi đã bằng văn bản, chúng tôi đã tuyên bố chính như int void main. Và tất cả các thời gian này, khoảng trống đó có chỉ đơn giản được quy định cụ thể rằng chương trình không có bất kỳ đối số dòng lệnh. Nói cách khác, khi người dùng chạy một chương trình, họ có thể cung cấp lệnh đối số dòng bằng cách viết thêm từ hoặc cụm từ sau của chương trình tên tại dấu nhắc. Vâng, nếu bạn bạn muốn chương trình của bạn đối số dòng lệnh, một hoặc nhiều từ như vậy, chúng ta cần phải thay thế làm mất hiệu lực với một vài đối số. Vì vậy, hãy làm điều đó. Bao gồm CS50.h. Bao gồm io.h. tiêu chuẩn Int main. Và bây giờ, thay vì bãi bỏ, tôi sẽ chỉ định một int argc, và một mảng các chuỗi được gọi là argv. Bây giờ, argc và argv là chỉ đơn giản là quy ước. Chúng ta có thể gọi là những lập luận hầu hết bất cứ điều gì chúng ta muốn. Nhưng điều quan trọng là argc là một int bởi vì, theo định nghĩa, đó là sẽ có các số tham số, số từ trong tổng số các dùng đã gõ tại dấu nhắc của mình. argv, trong khi đó, vector lập luận, là sẽ thực sự là một mảng lưu trữ tất cả các từ mà người sử dụng có gõ tại dấu nhắc của mình. Hãy tiến hành để làm một cái gì đó bây giờ với một hoặc nhiều các đối số dòng lệnh. Đặc biệt, chúng ta hãy đi trước và in bất cứ điều gì từ các loại sử dụng sau khi tên của chương trình tại dấu nhắc. Mở khung. Đóng khung. Printf phần trăm s dấu gạch chéo ngược và dấu phẩy. Và bây giờ tôi cần phải nói với printf những gì giá trị để cắm vào giữ chỗ đó. Tôi muốn từ đầu tiên mà người dùng có gõ sau khi tên của chương trình, và vì vậy tôi sẽ chỉ định argv khung 1, gần ngoặc đơn, dấu chấm phẩy. Bây giờ, tại sao khung 1 và không khung 0? Vâng, nó quay ra, tự động lưu trữ trong argv 0 là có được các tên thực tế của chương trình. Vì vậy, từ đầu tiên mà người dùng sau khi tên của chương trình là, bằng cách quy ước, sẽ được lưu trữ trong argv 1. Bây giờ chúng ta biên dịch và chạy chương trình này. Làm argv 0, dấu chấm dấu gạch chéo argv 0. Và bây giờ là một từ như xin chào. Nhập. Và chúng tôi đã có nó, xin chào. [END phát lại video] ROB Boden: Được rồi. Đóng cửa đó. Vì vậy, khi nhìn vào chương trình đó chúng tôi chỉ giới thiệu cho chúng tôi, tốt, chỉ cần cho thấy, nếu chúng ta in argv 0, làm cho, bây giờ nó là gì, argv 0, dấu chấm dấu gạch chéo argv 0. Vì vậy, như mong đợi, nó in ra tên của chương trình, vì argv 0 là luôn luôn có được sự tên của chương trình. Nhưng chúng ta hãy làm một cái gì đó bit thú vị hơn. Vì vậy, trong bộ vấn đề, bạn sẽ có giới thiệu với chức năng này, atoi. Vì vậy, những gì chúng ta sử dụng atoi cho? Đó là sẽ chuyển đổi một chuỗi số nguyên. Vì vậy, nếu tôi vượt qua chuỗi, một hai ba, để atoi, mà sẽ chuyển đổi đó đến số nguyên, một hai ba. Vì vậy, chúng ta sẽ chuyển đổi đầu tiên đối số dòng lệnh để một số nguyên, và sau đó chỉ cần in số nguyên. Vì vậy, về cơ bản, chúng tôi loại reimplementing getInt, chỉ cần số nguyên được nhập vào lệnh dòng thay vì trong chương trình tương tác. Vì vậy, sau đó, làm cho argv 0, chúng ta hãy làm nó ở đây, và đóng đó. Vì vậy, chạy argv 0, và chúng ta hãy nhập vào số nguyên, một hai ba bốn một hai. Vì vậy, nó sẽ in các số nguyên, một hai ba bốn một hai. Có một số tinh tế để atoi mà nó sẽ dừng lại quan tâm đến bất cứ điều gì xa hơn một ký tự số hợp lệ, nhưng điều đó không quan trọng. Vì vậy, những gì bạn nghĩ sẽ xảy ra nếu tôi làm điều này? Lỗi phân khúc. Vì vậy, tại sao vậy? Nếu bạn nhìn lại chương trình của chúng tôi, chúng tôi chuyển đổi argv 1, tham số đầu tiên sau khi tên chương trình, một số nguyên. Nhưng không có lập luận thông qua sau khi tên chương trình. Vì vậy, ở đây, chúng ta thấy rằng đây là một lỗi chương trình, vì, nếu chúng ta cố gắng chạy nó mà không có bất kỳ đối số, nó sẽ chỉ sụp đổ. Vì vậy, một mô hình phổ biến, bạn sẽ thấy là một cái gì đó giống như, nếu argc ít hơn hai, chỉ ra rằng có không ít nhất là tên chương trình và một Đối số đầu tiên, sau đó chúng tôi sẽ làm một cái gì đó như printf, không đủ đối số dòng lệnh. Đó có lẽ không một tốt để in, nó có thể là một cái gì đó, như bạn nên nhập một số nguyên tại dòng lệnh. Tôi sẽ chỉ kết thúc ở đó. Và sau đó trở về 1. Vì vậy, hãy nhớ rằng vào cuối của chúng tôi chương trình, nếu chúng ta trở về 0, mà loại chỉ ra thành công. Và chính cũng tự động trả về 0 nếu bạn không. Vì vậy, ở đây, chúng ta đang retuning 1 để chỉ rằng đó không phải là thành công. Và bạn có thể trở lại bất cứ điều gì bạn muốn, chỉ, 0 chỉ thành công, và bất cứ điều gì khác chỉ ra thất bại. Vì vậy, hãy chạy phiên bản này của sự vật. Vì vậy, bây giờ, nếu chúng ta không nhập dòng lệnh đối số, nó sẽ cho một cách chính xác chúng ta, không đủ dòng lệnh. Đã không hoàn thành câu. Khác, nếu chúng ta thực sự vượt qua nó một, nó có thể hoàn thành chương trình. Vì vậy, đây là cách bạn sẽ sử dụng trong argc Để xác nhận số đối số dòng lệnh đang thực sự được thông qua. Vì vậy, hãy làm cho chương trình này nhiều hơn một chút phức tạp, và nhìn vào thứ hai lặp đi lặp lại của sự vật. Vì vậy, bây giờ, chúng tôi không chỉ in đầu tiên đối số dòng lệnh. Ở đây, chúng ta đang lặp lại từ bình đẳng i int 0, i nhỏ hơn argc, tôi cộng cộng, và in ấn argv, chỉ số i. Vì vậy, mô hình này, một lần nữa, đây là cùng mô hình như trước, ngoại trừ thay vì gọi biến n, chúng tôi đang sử dụng argc. Vì vậy, đây được lặp lại trên mỗi chỉ số trong mảng, và in ấn mỗi phần tử trong mảng đó. Và như vậy, khi chúng tôi chạy chương trình này, tốt, Tôi không nhập bất kỳ dòng lệnh lập luận, vì vậy nó chỉ in tên chương trình. Nếu tôi nhập một loạt các thứ, nó sẽ in một, mỗi ngày một dòng riêng. OK. Vì vậy, chúng ta hãy thêm một bước này. Và thay vì in mỗi đối số trên một dòng riêng, chúng ta hãy in mỗi đặc tính của từng đối số trên một dòng riêng. Vì vậy, hãy nhớ rằng argv là một mảng các chuỗi. Vì vậy, một chuỗi là gì, nhưng một loạt các ký tự? Vì vậy, đó có nghĩa là argv thực sự là một mảng của một mảng các ký tự. Vì vậy, tận dụng lợi thế đó, chúng ta hãy bỏ qua điều này cho bây giờ. Chúng ta hãy xem xét các chuỗi argv 0. Vì vậy, nếu chúng tôi muốn mang lại cho mỗi nhân vật của argv 0 trên một dòng riêng, sau đó tôi muốn để làm mô hình chúng tôi đang sử dụng để, tôi là ít hơn so với chiều dài của mảng, mà ở đây, là strlen của, đó là không phải những gì tôi muốn làm, chuỗi s bằng argv 0. Vì vậy, tôi là ít hơn so với chiều dài của chúng tôi mảng, mà trong trường hợp này là một mảng của các nhân vật, tôi cộng với cộng. Và như vậy, như chúng ta đã thấy tuần trước, đó là lý tưởng nếu chúng ta di chuyển mà strlen bên ngoài điều kiện, kể từ n sẽ được bổ sung thêm strlen của s mỗi lần chúng tôi đi thông qua các vòng lặp, và nó sẽ không được thay đổi. Vì vậy, chúng tôi sẽ thiết lập nó bằng n ở đây. OK. Vì vậy, bây giờ, chúng ta đang lặp lại trên mỗi chỉ số trong mảng. Và như vậy, nếu chúng ta muốn in mỗi nhân vật trong đó mảng, phần trăm c là cờ chúng tôi muốn sử dụng cho các nhân vật. Và bây giờ là một i khung là có được các chuỗi, nhân vật chỉ số i, vì vậy nếu chuỗi là hello. sau đó s 0 là có được h, s khung 1 sẽ là e, và như vậy. Vì vậy, bây giờ chúng tôi muốn kết hợp hai điều này. Chúng tôi muốn in mỗi nhân vật của mỗi đối số dòng lệnh. Vì vậy, chúng ta sẽ có một lồng nhau cho vòng lặp. Theo quy ước, các truy cập đầu tiên là tôi, tiếp theo là có được j, n sẽ là strlen của argv i, i là nhỏ hơn n, tôi cộng với cộng. Và bây giờ thay vì in ấn argv tôi, vì vậy argv khung tôi sẽ chỉ số - đó sẽ là dòng lệnh thứ i lập luận, argv i, j sẽ là nhân vật thứ j đối số thứ i. Tôi sẽ thoát khỏi điều này ở đây bây giờ kể từ khi chúng tôi đặt nó vào vòng lặp đó. Như vậy là tương đương với chuỗi s bình đẳng argv tôi, và sau đó s khung j. Vâng, chúng ta không cần phải khai báo s biến này. Thay vào đó, chúng ta sẽ kết hợp các hai vào những gì chúng tôi đã có, argv i, j. SPEAKER 1: [nghe được]. ROB Boden: Tốt gọi. Vì vậy, đây là bị hỏng. Nếu tôi thực sự chạy nó, chúng ta sẽ đã nhận ra điều này. Vì vậy, quầy tôi quan tâm trong đặc biệt này vòng lặp là j, iterator. Vì vậy, bạn đã có thể chạy vào các vấn đề, có thể là một vòng lặp vô hạn, nếu chúng ta đã không cố định. Đó là lý do tại sao chúng tôi cũng đang nói về gỡ lỗi ngày hôm nay. OK. Vì vậy, hãy chạy chương trình này. Và chúng ta hãy thực sự thêm một printf riêng ngay tại đây mà chỉ cần sẽ in một dòng khác, vì điều này có nghĩa là khi chúng ta chạy chương trình, sẽ có một trống dòng ở giữa mỗi nhân vật của mỗi đối số dòng lệnh. Vâng, chúng ta sẽ thấy điều đó có nghĩa. Oop. Có một số lỗi. Lỗi ngầm tuyên bố chức năng thư viện strlen. Vì vậy, sẽ trở lại vào chương trình của chúng tôi, tôi quên băm bao gồm string.h. Vì vậy, string.h là có được các tập tin tiêu đề mà tuyên bố chức năng strlen. OK, nó biên dịch. Bây giờ, hãy chạy nó. Vì vậy, điều đó. Nó sẽ in ra của chúng tôi tên chương trình, xin chào thế giới. Nó sẽ in mỗi điều, mỗi nhân vật, trên một dòng riêng. OK. Vì vậy, hãy thực hiện việc này thêm một bước nữa. Và thay vì sử dụng string.h, chúng ta hãy suy nghĩ về cách chúng tôi muốn thực hiện riêng của chúng tôi chức năng strlen. Vì vậy, tôi sẽ ngay lập tức cung cấp cho một chữ ký chức năng. Vì vậy, chúng ta hãy gọi trong my_strlen, và nó sẽ mất một chuỗi như một tham số, và chúng tôi hy vọng sẽ trở lại chiều dài của chuỗi. Vì vậy, nơi anh chàng đó? Vâng. OK. Vì vậy, nhớ từ slide trước đó cũng là từ tuần trước, rằng một mảng kí tự, tốt, một chuỗi, vì vậy hãy nói điều này là chuỗi s của chúng tôi. Vì vậy, nếu s là chuỗi, xin chào, sau đó, H-E-L-L-O, trong bộ nhớ, đó là sẽ được, và sau đó dấu gạch chéo ngược này 0 ký tự. Vì vậy, làm thế nào để chúng ta có được chiều dài của s? Vâng, các trick là tìm kiếm này phản ứng dữ dội 0 nhân vật, vô giá trị này terminator. Vì vậy, các thuật toán là đi là một cái gì đó như vài đủ ký tự - chúng ta hãy có tay này đại diện cho một số truy cập, chúng ta hãy gọi chiều dài int này. Vì vậy, bắt đầu từ trên đây, chúng tôi sẽ lặp qua chuỗi của chúng tôi. Vì vậy, các ký tự đầu tiên, đó là H, và nó không trở lại cắt giảm 0, do đó chiều dài là 1. Lặp với nhân vật tiếp theo, E, và nó không phải dấu gạch chéo ngược 0. Chiều dài là 2. L, 3. L, 4. O, 5. Và cuối cùng, chúng ta đạt được dấu gạch chéo ngược 0, và như vậy có nghĩa là, tốt, chuỗi này là hơn. Vì vậy, chúng ta hãy quay trở lại 5. Vì vậy, thực sự thực hiện điều đó, đầu tiên, chiều dài n của tôi bằng 0, tay phải của tôi. Và chúng ta sẽ lặp - SPEAKER 1: [nghe được] ROB Boden: Oh, bắn. Tốt cuộc gọi. Bùng nổ. Vì vậy, n chiều dài bằng 0. Vì vậy, bây giờ, trong khi chiều dài s không bình đẳng và sau đó, dấu gạch chéo ngược 0. Vì vậy, hãy nhớ rằng, dấu gạch chéo ngược này 0, nó là một nhân vật thực tế, và nó cho thấy kết thúc của chuỗi. Cũng giống như, cũng, dấu gạch chéo ngược n là một nhân vật thực tế. Dấu gạch chéo ngược 0 sẽ chỉ cuối chuỗi của chúng tôi. Tôi không muốn đặt rằng có. Và trong khi s được lập chỉ mục theo chiều dài không phải là bằng các terminator null, sau đó chúng ta chỉ cần đi để tăng chiều dài. Vì vậy, sau đó, vào cuối chương trình của chúng tôi, chiều dài là cuối cùng sẽ là 5 trong trường hợp này. Và chúng tôi sẽ chỉ trả lại chiều dài. OK. Vì vậy, bây giờ xuống đây, tôi không làm my_strlen. Hãy biên dịch nó để đảm bảo tất cả mọi thứ chạy rất tốt. Tôi đang làm gì trong 2? Hoặc là 1? Điều đó sẽ làm. Được rồi. Vì vậy, đây là argv 2. Hoạt động như dự kiến, mặc dù là một trong những tôi đã làm nó trong? Vâng. OK. Phiên bản này của việc không có printf dòng mới sau, nhưng nó không thực hiện bất kỳ sự khác biệt. OK. Vì vậy, làm việc như mong đợi. Bây giờ chúng tôi thậm chí có thể kết hợp một bước hơn nữa, nơi đây thông báo, tốt, đầu tiên, chúng ta đang cầm strlen của argv i, và sau đó chúng tôi đang lặp lại trên mỗi nhân vật trong chuỗi. Vì vậy, thay vì làm điều đó, nếu chúng ta chỉ cần kết hợp logic này chờ đợi cho đến khi chúng ta đánh dấu chéo ngược đúng 0 vào việc này cho vòng lặp? Vì vậy, trong khi lặp argv i, j không dấu gạch chéo ngược không bằng 0. Vì vậy, hãy chạy nó lần đầu tiên. Được rồi. Vì vậy, ở đây, tình trạng này đang nói đến - chúng ta cần xóa đó. Vì vậy, bây giờ, để điều này là argv của chúng tôi. Vì vậy, khi tôi chỉ cần chạy chương trình trước đây, argv là một mảng của chuỗi. Và như vậy, nếu tôi chạy nó với dấu chấm dấu gạch chéo argv 2, hello thế giới, sau đó argv chính nó là chiều dài 3, cho argv bằng không, xin chào, và thế giới. Và bên trong của mỗi của các chỉ số là, bản thân một mảng, nơi này sẽ có dot, đây sẽ là dấu gạch chéo, tôi không biết nếu đó là đúng hướng, tôi không nghĩ rằng nó là. A-R-V gạch ngang, cần nhiều không gian hơn. Chúng ta hãy cắt vào mảng này. A-R-V gạch ngang 0, và sau đó dấu gạch chéo ngược 0. Và sau đó trong tình trạng hỗn loạn sẽ chào. Hãy nói rằng, H-E dấu gạch chéo ngược 0. Và cuối cùng, W-O dấu gạch chéo ngược 0. Vì vậy, các thuật toán mà chúng ta vừa viết, lồng nhau cho các vòng, những gì họ đang làm là, đầu tiên chúng ta có chống lại tôi và sau đó j. Điều này sẽ dễ dàng hơn với mã trên màn hình, Chúng ta hãy quay trở lại này. OK. Vì vậy, nhận thấy rằng tôi là lặp đó là lặp lại trên mỗi lệnh đối số dòng. Và j là iterating lặp trên mỗi nhân vật trong đó đối số dòng lệnh. Vì vậy, những gì printf trong cùng này đang làm được, chúng tôi đã printf argv 0 0, printf argv 0 1, printf argv 0 2, 0 3, 0 4, 0 5, 0 6, nhưng bây giờ, argv 0 7 sẽ dấu gạch chéo ngược bằng 0. Vì vậy, sau đó chúng ta thoát khỏi đó cho vòng lặp, và bây giờ tôi lặp 1. Và bây giờ chúng ta sẽ in argv 1 0, argv 1 1 - tốt, bây giờ, kể từ khi tôi cắt ngắn chào, argv 1 2 một lần nữa sẽ là dấu gạch chéo ngược 0. Và vì vậy, tăng i và tiếp tục, và như vậy, cho đến khi chúng ta in ra tất cả các thế giới, và đó là ba dòng lệnh lập luận, và chúng tôi sẽ thoát ra khỏi vòng ngoài cùng, và hoàn thành chương trình của chúng tôi. OK. Vì vậy, chúng ta hãy trở lại đây. Vì vậy, bạn sẽ đạt được một số hiểu biết về đối số dòng lệnh này vấn đề cụ thể thiết lập. Bây giờ, gỡ lỗi. Vì vậy, bạn có lẽ đã phải làm một số lỗi với trước đó của bạn vấn đề thiết lập. Và một cách rất dễ dàng gỡ lỗi, đầu tiên, chúng ta hãy xem xét một chương trình lỗi. Vâng, đi bộ qua chương trình này, chúng tôi sẽ yêu cầu người dùng cho một số nguyên, lấy số nguyên, và sau đó, tùy tiện, chúng tôi có một vòng lặp trong khi đó chỉ là sẽ làm giảm giá trị tôi cho đến khi nó bằng 10. Chúng ta hãy giả sử tôi đang nhập một số nguyên lớn hơn 10. Vì vậy, làm giảm giá trị tôi cho đến khi nó bằng 10. Và sau đó chúng tôi có một vòng lặp trong khi rằng, trong khi tôi không bằng 0, chúng ta sẽ làm giảm giá trị i 3. Vì vậy, nếu bạn nhìn thấy mục đích của lỗi ở đây, nó rằng điều này sẽ làm giảm giá trị i cho là 10, và sau đó điều này trong khi vòng lặp ý lượng giảm của i từ 10, 7, 4, 1, để tiêu cực 2, để tiêu cực 5, và như vậy, từ âm vô cùng, vì tôi sẽ không bao giờ thực sự bằng 0. Và sau đó vào cuối của chương trình này, chúng tôi có chức năng foo là xảy ra in ra rằng tôi. Vì vậy, đây là một chương trình ngắn và tầm thường, và lỗi này là hiển nhiên, đặc biệt là sau khi tôi chỉ nói những gì là lỗi. Nhưng mục đích ở đây là, tốt, điều này có thể thực sự trông giống như một số bạn các giải pháp từ tham lam từ cuối vấn đề thiết lập, và có thể bạn có một số vòng lặp vô hạn trong chương trình của bạn, và bạn không có ý tưởng những gì gây ra nó. Vì vậy, một kỹ thuật gỡ lỗi rất hữu ích là chỉ cần thêm printfs trên tất cả các mã. Vì vậy, ở đây tôi muốn có một printf bên ngoài đầu tiên vòng lặp while. Và ở đây tôi muốn có một printf, và tôi sẽ chỉ cần in tôi. Tôi thậm chí sẽ làm đầu tiên khi vòng lặp, i. Bên ngoài, thứ hai khi vòng lặp. Một lần nữa, in bên trong đây, giá trị i. Và chúng ta hãy chạy này. Vì vậy, dấu chấm dấu gạch chéo gỡ lỗi. Nhập một số nguyên. Chúng ta hãy làm 13. Và sự bùng nổ. Chúng ta thấy rằng chúng ta là vòng lặp vô hạn bên trong vòng lặp trong khi thứ hai. Vì vậy, bây giờ chúng tôi biết những gì là lỗi. Nhưng printf gỡ lỗi là hoàn toàn tuyệt vời, nhưng một khi chương trình của bạn được dài hơn và phức tạp hơn, có các giải pháp tinh vi hơn để nhận những điều làm việc. Vì vậy, hãy loại bỏ tất cả các printfs. Và hãy chắc chắn rằng tôi đã không phá vỡ bất cứ điều gì. OK. Vì vậy, các chương trình chúng ta sẽ giới thiệu được gọi là GDB, cho GNU Debugger. Vâng, thực sự, chúng ta hãy loại bỏ gỡ lỗi cho một giây, và làm cho gỡ lỗi một lần nữa. Vâng, thực sự đầu tiên, một bài học tốt trong đối số dòng lệnh. Chú ý rằng lệnh Clang này đó là biên dịch tất cả mọi thứ đang được thông qua tại dòng lệnh, các đối số dòng lệnh. Vì vậy, chính xác làm thế nào bạn sẽ được sử dụng đối số dòng lệnh, như chúng ta đã làm trước đây, và như bạn sẽ ở PSET 2, đó là cách kêu vang được sử dụng chúng. Vì vậy, nhận thấy rằng lần đầu tiên lá cờ, dấu gạch ngang này ggdb3, đó là những gì nói là, kêu vang, bạn nên biên dịch tập tin này với Mục đích mà chúng ta sẽ dần dần cần phải gỡ lỗi nó. Vì vậy, miễn là bạn có lá cờ đó, sau đó chúng ta có thể GDB gỡ lỗi. Và nó sẽ mở ra các GNU Debugger. Vì vậy, có rất nhiều các lệnh mà bạn cần phải làm quen với. Người đầu tiên mà bạn sẽ có thể ngay lập tức cần là Run. Vì vậy, những gì đang chạy sẽ làm gì? Nó sẽ bắt đầu chương trình của chúng tôi. Vì vậy, chạy, chương trình bắt đầu, chương trình đòi hỏi chúng ta cho một số nguyên, 13. Và sau đó nó vòng lặp vô hạn như dự kiến, ngoại trừ tôi loại bỏ các printfs, vì vậy chúng tôi thậm chí không thấy điều đó. Đã thoát bình thường. Oh. Có thể là nó được bao bọc tất cả các con đường xung quanh, trở lại - bỏ qua mà. Giả sử nó đã không thoát khỏi bình thường. Có một câu trả lời phức tạp đó. Vì vậy, bây giờ, đó không phải là rất hữu ích. Vì vậy, chỉ cần chạy chương trình của chúng tôi bên trong sửa lỗi này không giúp chúng tôi trong bất kỳ cách, vì chúng ta có thể chỉ cần thực hiện dot giảm gỡ lỗi từ bên ngoài GDB. Vì vậy, một lệnh bạn sẽ có thể - và tôi sẽ bỏ thuốc lá này. Kiểm soát-d hoặc bỏ thuốc lá, cả hai công việc. Vì vậy, hãy mở nó lên một lần nữa. Lệnh khác mà bạn sẽ có thể ngay lập tức muốn được sử dụng để là Break. Vì vậy, chúng tôi sẽ phá vỡ trên chính hiện nay, và sau đó tôi sẽ giải thích đó. Vâng, ở đây chúng ta thấy chúng ta thiết lập một breakpoint ở dòng này trong debug.c. Vì vậy, những gì là phương tiện phá vỡ khi tôi gõ chạy, chương trình sẽ tiếp tục chạy cho đến khi Tôi nhấn một điểm dừng. Vì vậy, khi tôi nhấn chạy, chương trình bắt đầu, và sau đó nó phá vỡ ngay sau khi nó đi vào các chức năng chính. Phá vỡ chính là có được một cái gì đó bạn khá thường làm. Và bây giờ, giới thiệu với bạn một số lệnh khác. Chú ý ở đây, mà nó nói rằng chúng tôi đã phá vỡ tại dòng 11, đó là printf, nhập một số nguyên. Vì vậy, các lệnh tiếp theo sẽ là như thế nào chúng tôi đi đến dòng tiếp theo của mã. Điều này sẽ cho phép chúng ta bước thông qua đường dây chương trình của chúng tôi bằng dòng. Vì vậy, tiếp theo. Tại dòng 12, chúng ta sẽ để có được những số nguyên. Tiếp theo. Và nếu bạn chỉ cần nhấn Enter lần nữa, nó sẽ làm lại điều cuối cùng bạn đã làm. Vì vậy tôi không cần phải gõ tiếp theo mỗi lần. Vì vậy, nhập một số nguyên, 13. Vì vậy, bây giờ, dòng 14, trong khi tôi lớn hơn 10, và tôi sẽ làm gì tiếp theo. Và chúng ta thấy chúng ta sẽ giảm giá trị của tôi. Vì vậy, chúng ta sẽ giảm giá trị của tôi một lần nữa. Vì vậy, bây giờ, khác hữu ích lệnh Print. Vì vậy, In sẽ in ra giá trị của biến. Hãy đưa ra các giá trị của tôi biến. Hãy in i. Nó sẽ nói rằng tôi là 11. Bây giờ chúng ta Next một lần nữa trong khi i lớn hơn 10. Vì vậy, tôi vẫn lớn hơn 10, kể từ khi nó 11. i trừ trừ. Hãy in tôi một lần nữa. Như mong đợi, đó là 10. Vì vậy, bây giờ, tiếp theo. Nó sẽ trở lại tình trạng này, tôi là lớn hơn 10, nhưng bây giờ tôi là 10, vì vậy nó không lớn hơn 10, vì vậy chúng tôi mong đợi nó rơi ra khỏi vòng lặp trong khi. Và bây giờ chúng tôi dưới đây dòng mã. Và một lệnh, Danh sách, chỉ là đi để hiển thị trước và sau vài dòng mã, trong trường hợp bạn bị mất chính mình. Vì vậy, chúng ta chỉ cần thoát vòng lặp trong khi điều này, và bây giờ chúng tôi đã nhập này trong khi vòng lặp, dòng 18. Vì vậy, trong khi tôi không bằng 0. Và, sau đó, tôi bằng i trừ 3, và chúng tôi sẽ nhận thấy, điều này sẽ chỉ tiếp tục đi. Và chúng ta có thể in i. Mỗi lệnh loại có phím tắt. Vì vậy, p là viết tắt của In. Vì vậy chúng tôi có thể p i. Chỉ cần giữ giữ n, hoặc tiếp tục làm tiếp. In tôi một lần nữa. Bạn nhìn thấy bây giờ là tiêu cực 167. Vì vậy, đây sẽ đi mãi mãi, nhưng không thực sự mãi mãi, kể từ khi bạn chỉ nhìn thấy, nó thực sự sẽ kết thúc tại một số điểm. Vì vậy, đó là điểm bắt đầu GDB. Nhưng chúng ta hãy làm một điều nữa trong GDB. Uh, gỡ lỗi. Vì vậy, trong trường hợp cụ thể này, vòng lặp vô hạn xảy ra để được bên trong các chức năng chính. Và bây giờ, chỉ cần chấp nhận rằng tôi sẽ di chuyển vào vòng lặp vô hạn foo chức năng. Chỉ cần nhớ rằng, vào cuối này chương trình, tốt, điều này đã được ban đầu gọi foo, mà chỉ sẽ in i. Nhưng bây giờ chúng tôi đang gọi điện thoại foo, đó là sẽ làm giảm giá trị tôi cho đến khi nó 0, và sau đó in biến đó. OK. Tiết kiệm đó. Làm cho gỡ lỗi. Và bây giờ, gdb gỡ lỗi. OK. Vì vậy, nếu tôi chỉ cần chạy sau đó tôi sẽ không có thể thực sự bước qua tôi chương trình dòng-by-line. Vì vậy, chúng ta hãy phá vỡ tại chính, và sau đó gõ chạy. Vì vậy, đi qua này, printf, nhập một số nguyên, có được số nguyên, 13. Vì vậy, chúng tôi sẽ tiếp tục decrementing cho đến khi tôi lớn hơn 10. Sau đó chúng ta sẽ rơi qua trong khi vòng lặp, và nhận được đến dòng - chúng ta hãy mở nó lên trong một cửa sổ riêng biệt. Vì vậy, chúng ta giảm đi cho đến khi tôi không còn lớn hơn 10, và sau đó chúng tôi gọi là chức năng, foo. Vì vậy, những gì đã xảy ra ngay sau khi tôi nhấn foo chức năng, tốt, tôi gọi là foo, và sau đó tôi không còn kiểm soát GDB. Vì vậy, ngay sau khi tôi nhấn Next ở dòng này, điều tiếp tục cho đến khi điều này xảy ra, mà chương trình đã thoát khi - giả sử nó đã không tồn tại cuối cùng. Bạn nhìn thấy nó dừng lại một chút mặc dù. Tại sao tôi lại mất kiểm soát chương trình tại thời điểm đó? Vâng, khi tôi gõ tiếp theo, mà đi đến nghĩa đen dòng tiếp theo của mã sẽ thực hiện. Vì vậy, sau khi dòng 21, dòng tiếp theo của mã mà sẽ thực hiện là dòng 22, đó là, rút ​​lui khỏi chính. Vì vậy, tôi không muốn chỉ đi đến dòng kế tiếp của mã. Tôi muốn đi vào các chức năng, foo, và sau đó cũng bước qua những dòng mã. Vì vậy, cho rằng, chúng ta có một sự thay thế. Chúng ta hãy bỏ một lần nữa. Phá vỡ chính. Uh, 1, tiếp theo, tiếp theo, 13, tiếp theo, tiếp theo, tiếp theo, cẩn thận, trước khi chúng tôi đánh dòng foo. OK. Vì vậy, bây giờ, chúng ta đang ở dòng 21, nơi mà chúng tôi gọi foo. Chúng tôi không muốn gõ tiếp theo, vì đó sẽ chỉ gọi hàm foo, và đi vào dòng tiếp theo của mã. Bước những gì chúng tôi muốn sử dụng là. Do đó, có một sự khác biệt giữa Bước và Tiếp theo, nơi Bước bước vào chức năng, và tiếp theo đi trong chức năng. Nó chỉ thực hiện toàn bộ chức năng và giữ đi. Vì vậy, Bước sẽ mang lại cho chúng tôi vào chức năng, foo. Và chúng tôi thấy ở đây, bây giờ, chúng tôi lại này vòng lặp trong khi đó, về mặt lý thuyết, sẽ tiếp tục mãi mãi. Và nếu bạn nhấn bước, khi nó không phải là thậm chí một chức năng gọi, sau đó nó giống Next. Vì vậy, nó chỉ khi bạn đang ở một dòng đang kêu gọi một chức năng mà Bước sẽ khác với Next. Vì vậy, bước sẽ mang lại cho chúng tôi ở đây. Bước, bước, bước, bước, bước, bước, và chúng ta sẽ chỉ là vòng lặp vô hạn mãi mãi. Vì vậy, bạn có thể có được sử dụng đó như bạn cách xác định vòng lặp vô hạn, là chỉ giữ này phím Enter để xem nơi bạn gặp khó khăn. Có nhiều cách tốt hơn để làm điều đó, nhưng bây giờ, đó là hoàn toàn đầy đủ. Và phong cách, phù hợp với phong cách 50, tôi nên đã làm điều này. OK. Vì vậy, một lệnh cuối cùng để giới thiệu. Vâng, chúng ta hãy gdb gỡ lỗi in Vì vậy, thay vì vi phạm tại chính, nếu tôi biết hàm foo cũng là vấn đề, sau đó tôi có thể chỉ nói, phá vỡ tại foo, thay thế. Hãy nói rằng tôi phá vỡ tại cả hai chính và foo. Vì vậy, bạn có thể thiết lập nhiều điểm ngắt như bạn muốn. Khi tôi gõ chạy, nó sẽ dừng lại ở - ooh, hãy biên dịch lại, vì Tôi đã thay đổi mọi thứ. Bạn sẽ thấy dòng, cảnh báo, nguồn này tập tin mới hơn thực thi. Vì vậy, đó có nghĩa là tôi chỉ đi vào đây và thay đổi chúng cho phù hợp với phong cách 50, nhưng tôi đã không biên dịch lại chương trình. Vì vậy, GDB làm cho tôi nhận thức được rằng. Tôi sẽ bỏ thuốc lá, làm cho gỡ lỗi một lần nữa, nhấn gdb gỡ lỗi. OK. Vì vậy, bây giờ, trở lại với những gì tôi đang làm. Phá vỡ chính, nghỉ foo. Bây giờ nếu tôi chạy chương trình, do đó, nó sẽ tiếp tục cho đến khi truy cập một breakpoint. Breakpoint điều đó xảy ra là người đầu tiên tại chính. Bây giờ, thay vì làm tiếp theo, tiếp theo, tiếp theo, tiếp theo, tiếp theo, cho đến khi tôi nhấn foo, tôi có thể gõ tiếp tục, sẽ tiếp tục cho đến khi bạn nhấn breakpoint tiếp theo. Tôi phải nhập số nguyên đầu tiên. Tiếp tục sẽ tiếp tục cho đến khi tôi nhấn điểm dừng tiếp theo, đó là chức năng của foo. Vì vậy, Run sẽ chạy cho đến khi bạn nhấn một breakpoint, nhưng bạn chỉ gõ chạy khi bạn đang bắt đầu chương trình, và sau đó, từ đó, nó tiếp tục. Nếu tôi chỉ làm phá vỡ chính và sau đó chạy, nó sẽ phá vỡ tại chính, và sau đó tiếp tục. Vì tôi không có một điểm break ở foo, nhập số nguyên, sau đó bây giờ tôi sẽ không phá vỡ tại foo. Nó chỉ sẽ vô hạn vòng lặp cho đến khi đó. OK. Vì vậy, đó là Giới thiệu đến GDB. Bạn nên bắt đầu sử dụng nó trong bộ vấn đề của bạn. Nó có thể rất hữu ích để xác định lỗi. Nếu bạn thực sự chỉ cần, line-by-line, đi thông qua mã của bạn, và so sánh là những gì thực sự xảy ra với những gì bạn mong đợi xảy ra, sau đó nó đẹp khó khăn để bỏ lỡ lỗi của bạn. OK. Vì vậy, tuần trước David lớn lên này thứ mật mã bí mật quan trọng đối với lần đầu tiên, nơi mà chúng tôi không muốn các mật khẩu được lưu trữ trên của chúng tôi máy tính trong một số tập tin văn bản đơn giản, nơi ai đó có thể đi qua và chỉ mở nó lên và đọc chúng. Lý tưởng nhất, họ sẽ được mã hóa một cách nào đó. Và trong vấn đề Set 2, bạn sẽ được giao dịch với một phương pháp mã hóa, hay, tốt, hai phương pháp, nhưng họ không tuyệt vời như vậy. Nếu bạn làm phiên bản của hacker, bạn cũng sẽ được xử lý giải mã một số điều. Vì vậy, vấn đề bây giờ là, tốt, ngay cả khi chúng ta có mã hóa mạnh thuật toán trên thế giới, nếu bạn chọn một mật khẩu đặc biệt là người nghèo, sau đó nó sẽ không giúp đỡ bạn rất nhiều, kể từ khi người vẫn sẽ có thể con số nó ra. Ngay cả khi nhìn thấy những chuỗi mã hóa và nó trông giống như một mớ hỗn độn rác điều đó có nghĩa gì với họ, nếu họ vẫn chỉ cần thử một vài mật khẩu để con nó ra, sau đó bạn không phải là rất an toàn. Vì vậy, xem một đoạn video mà làm cho điểm đó. [VIDEO XEM LẠI] -Mũ bảo hiểm, bạn Fiend. Những gì đang xảy ra? Bạn đang làm gì để con gái tôi? -Cho phép tôi giới thiệu rực rỡ bác sĩ phẫu thuật trẻ, Tiến sĩ Phillip Schlotkin, mũi lớn nhất người đàn ông công việc trong toàn bộ vũ trụ, và Beverly Hills. -Hoàng thân của bạn. Mũi công việc? Tôi không hiểu. Cô ấy đã có một công việc mũi. Đó là một mười sáu ngọt ngào hiện tại. -Không có. Nó không phải những gì bạn nghĩ. Nó nhiều, tồi tệ hơn nhiều. Nếu bạn không cho tôi kết hợp để lá chắn không khí, Tiến sĩ Schlotkin sẽ cho con gái của bạn trở lại mũi cũ của mình. -Không có. Nơi mà bạn đã có được điều đó không? -Được rồi. Tôi sẽ nói cho. Tôi sẽ nói cho. Không, cha. Không, bạn phải không. -Anh phải, thân yêu của tôi. Tôi sẽ bỏ lỡ mũi mới của bạn. Nhưng tôi sẽ không nói cho anh ta sự kết hợp, không có vấn đề gì. -Rất tốt. Tiến sĩ Schlotkin, làm tồi tệ nhất của bạn. -Tôi niềm vui. [CÔNG CỤ ĐƯỢC mài] -Không có. Chờ đợi. Chờ đợi. Tôi sẽ nói cho. Tôi sẽ nói cho. -Tôi biết nó sẽ làm việc. Được rồi. Đưa nó cho tôi. -Sự kết hợp là một. -Một. -Một. -Hai. -Hai. -Hai. -Ba. -Ba. -Ba. -Bốn. -Bốn. -Bốn. -Five. -Five. -Five. -Vì vậy, sự kết hợp là một trong những, hai, ba, bốn, năm. Đó là sự kết hợp ngu ngốc Tôi từng được nghe trong cuộc sống của tôi. Đó là loại điều một thằng ngốc sẽ có trên hành lý của mình. -Cảm ơn bạn, Hoàng thân của bạn. -Bạn đã làm gì? -Tôi tắt tường. -Không có bạn thì không. Bạn tắt toàn bộ phim. -Tôi phải nhấn nút sai. -Vâng, đặt nó trở lại. Đưa bộ phim trở lại. -Vâng, thưa ngài. Vâng, thưa ngài. -Đi thôi, Arnold. Đến, Gretchen. Tất nhiên, bạn biết tôi vẫn sẽ thấy phải hoá đơn cho bạn cho việc này. [END phát lại video] ROB Boden: Được rồi. Vì vậy, bây giờ chúng ta đang nói về đã an ninh trong một số cách, đẹp ít poster phim, do đó gần đây ngày, những vấn đề này với NSA giám sát tất cả mọi thứ. Nó có thể được khó khăn để cảm thấy như bạn có một số loại bảo mật trong thế giới trực tuyến, mặc dù tôi không thể nói bạn hầu hết các chi tiết của PRISM. Vì vậy, đi xa hơn PRISM, chúng tôi sẽ không được nói về điều đó, bây giờ suy nghĩ về máy tính xách tay của bạn. Vì vậy, ở đây, tôi muốn chuyển đổi vào tài khoản thực tế của tôi, với chim cánh cụt nhỏ của tôi. Vì vậy, tôi có một bộ mật khẩu, và mật khẩu là bất cứ điều gì tôi muốn nó được. Nhưng hãy nhớ rằng những gì tôi đang đăng nhập với, do đó đăng nhập này nhanh chóng, một số chương trình. Đó là một số chương trình đó là được viết bởi một số người. Và như vậy, người đó, nếu họ đặc biệt độc hại, họ có thể đã nói, tất cả các bên phải, do đó, nếu mật khẩu mà tôi nhập bằng của tôi mật khẩu thực tế, hoặc nó bằng một số mật khẩu đặc biệt - David là tuyệt vời hoặc một cái gì đó - sau đó cho họ vào Vì vậy, một lập trình độc hại có thể có truy cập vào tất cả các máy Mac của bạn, hoặc Cửa sổ, hoặc bất cứ điều gì. Vì vậy, đó không phải là nhiều quan tâm, kể từ khi, Ý tôi là, đây là chương trình đăng nhập đó là vận chuyển với OS X, hàng trăm hoặc hàng ngàn người có xem xét mã này. Và như vậy, nếu, trong mã của bạn một nơi nào đó, bạn nói rằng nếu chuỗi này bằng bình đẳng David là tuyệt vời, đăng nhập, sau đó một ai đó có được, như thế, chờ đợi. Điều này không đúng. Điều này không nên ở đây. Vì vậy, đó là một cách mà chúng ta có được những thứ là loại an toàn. Nhưng suy nghĩ về chương trình thậm chí mà bạn viết. Hãy nói rằng bạn đã viết chương trình đăng nhập. Vì vậy, chương trình này đăng nhập mà bạn đã viết, vì vậy rõ ràng, bạn là một tốt lập trình viên. Bạn sẽ không đặt bất kỳ độc hại nếu x bằng bằng David là tuyệt vời vào mã của bạn. Nhưng chương trình này, những gì bạn sử dụng để biên dịch chương trình này? Một cái gì đó như Clang. Vì vậy, những gì nếu người xảy ra viết hoa chữ cái đầu Clang đặc biệt trong Clang một cái gì đó như, nếu tôi biên dịch chương trình đăng nhập, sau đó nhập mã này vào chương trình đăng nhập mà nói, nếu x bằng bằng David là tuyệt vời? Vì vậy, không hoàn toàn, nhưng chúng tôi có cùng một phát hành ở đây, nơi Clang, tốt, hàng ngàn, nếu không phải hàng chục ngàn người, đã nhìn Clang, có nhìn dòng của mã và nói: tất cả các bên phải, không có gì xấu ở đây là. Rõ ràng, không ai được làm bất cứ điều gì độc hại này. Nhưng những gì đang kêu vang chính nó, như, những gì nếu tôi biên dịch kêu vang? Nếu tôi có một số trình biên dịch biên dịch Clang chèn vào Clang hack này đặc biệt nói rằng, tất cả các bên phải, khi tôi biên dịch kêu vang, sau đó các thực thi tôi nhận được đặc biệt nên xem xét bên trong của chương trình đăng nhập và chèn mật khẩu này, bằng bình đẳng Dave là tuyệt vời? Vì vậy, hãy nhớ rằng trình biên dịch của bạn chính nó cần phải được biên dịch tại một số điểm. Vì vậy, nếu những gì bạn chọn để biên dịch Clang với, chính nó là độc hại, sau đó bạn có thể được vặn toàn bộ cách xuống dòng. Vì vậy, ở đây, chúng tôi có Ken Thompson và Dennis Ritchie. Vì vậy, đây là một hình ảnh mang tính biểu tượng. Dennis Ritchie là bên phải. Ông là một chính - khá nhiều viết C. Vì vậy, bạn có thể cảm ơn anh cho các lớp học này. Ken Thomson là bên trái. Hai người về cơ bản đã viết UNIX. Vâng, họ đã đóng góp lớn UNIX. Đã có một số người khác. Vì vậy, Ken Thompson, tại một số điểm, anh thắng giải thưởng Turing. Và giải thưởng Turing, tôi đã luôn luôn nghe nó tham chiếu theo cách này, đó là Giải Nobel khoa học máy tính. Vì vậy, tại giải thưởng Turing, ông đã bài diễn văn của mình. Và ông cho bài phát biểu rất nổi tiếng này bây giờ, được gọi là phản ánh về Đáng tin cậy Tin tưởng, mà chúng tôi đã liên kết Để vào trang web khóa học. Và trong bài phát biểu này, ông nói, tất cả các bên phải, vì vậy tôi đã viết UNIX, và bây giờ tất cả bạn người đang sử dụng UNIX. Bây giờ, hãy nhớ ngày hôm nay rằng Linux là một hậu duệ trực tiếp của UNIX. OS X trực tiếp sử dụng UNIX. Cửa sổ không quá nhiều, nhưng rất nhiều các ý tưởng được lấy từ UNIX. Vì vậy, ông đi lên sân khấu và nói: tất cả các bên phải, tôi đã viết UNIX. Và chỉ để các bạn biết, tôi thể đăng nhập vào tất cả các một duy nhất của máy tính của bạn. Kể từ khi tôi đặt một trong những đặc biệt nếu x bằng bằng Ken Thomson là tuyệt vời, sau đó tôi được phép đăng nhập. Để mọi người là như thế, tốt, sao cô làm điều đó? Chúng ta nhìn vào chương trình đăng nhập và không có gì ở đó. Anh ấy như, tốt, tôi sửa đổi các trình biên dịch để đăng nhập vào chương trình đăng nhập để chương trình đăng nhập sẽ có mà x bằng bằng Ken Thompson là tuyệt vời. Và họ nói, tốt, đó là không đúng sự thật. Chúng tôi đang tìm kiếm các trình biên dịch, và trình biên dịch không có bất kỳ dòng mã như thế đó. Anh ấy là như thế, OK, nhưng bạn là gì biên soạn các trình biên dịch với? Và họ nghĩ, và anh ấy, như, tốt, Tôi là một trong những người đã cho bạn trình biên dịch bạn đang sử dụng để biên dịch các trình biên dịch, vì vậy bạn đang biên soạn một trình biên dịch, mà chính nó là độc hại, và sẽ phá vỡ chương trình đăng nhập. Vì vậy, về cơ bản, vào thời điểm đó, có không có cách nào bạn có thể nhìn vào mã nguồn mã số của chương trình đăng nhập để xem những gì là sai trái. Bạn thậm chí không thể nhìn vào mã nguồn của trình biên dịch để xem những gì là sai trái. Bạn sẽ cần phải nhìn vào máy mã, nhị phân thực tế của trình biên dịch biên soạn để xem, chờ đợi, những dòng mã không nên ở đây. Nhưng Ken Thompson lấy nó một bước hơn nữa và nói tốt, có các chương trình đặc biệt mà thực sự giúp bạn đọc nhị phân của chương trình, và do đó, nếu một người nào đó sử dụng chương trình để đọc nhị phân, họ sẽ thấy những dòng mã. Ông đã điều chỉnh các chương trình để nói, tất cả bên phải, nếu bạn đang tìm kiếm các trình biên dịch, không hiển thị đặc biệt này bộ nhị phân. Vì vậy, sau đó bạn cần phải có một bước hơn nữa và về cơ bản, có thể có thực hiện nhiều mức độ về mình, và tại một số điểm, không ai thực sự sẽ được kiểm tra. Vì vậy, đạo đức của câu chuyện là, bạn sẽ không được viết Kêu vang trong lớp học này. Bạn sẽ được sử dụng leo núi Kêu vang rất nhiều trong lớp học này. Cho tất cả các bạn đã biết, kêu vang là một độc hại chương trình được phá hoại tất cả chương trình duy nhất bạn đã từng biên dịch. Và để lại cho bạn về điều đó rất đáng ngại lưu ý, xem bạn vào ngày thứ Tư. [Vỗ tay] SPEAKER 2: Tại CS50 tiếp theo. SPEAKER 3: Anh không dám nói rằng. Bạn có thể làm điều này. Bạn đã làm điều này trước khi, bạn có thể làm điều này hôm nay, bạn có thể làm điều này vào ngày mai. Bạn đã làm điều này trong nhiều năm. Chỉ cần đi lên đó và làm điều này. Bạn có thể làm điều này. [MUSIC CHƠI]