>> SPEAKER 1: Hãy viết một chương trình được một chuỗi từ người sử dụng mà không cần
sử dụng Thư viện của CS50 chức năng GetString.
Để làm điều này, chúng tôi sẽ đi trước và sử dụng scanf, chức năng rằng GetString
chức năng thực sự sử dụng bên dưới mui xe.
Nhưng tôi sẽ làm điều này cố tình một cách lỗi.
Tôi sẽ làm theo một cách mà tôi nghĩ rằng sẽ là đúng, nhưng nó quay ra rằng
giả định của tôi sẽ được khá, khá sai lầm.
Và trong thực tế, khá nguy hiểm.
Vì lỗi như một trong những tôi về để thực có thể được khai thác bởi các đối thủ
như vậy mà máy tính của bạn hoặc chương trình của bạn có thể được thực hiện trên có khả năng.
>> Hãy bắt đầu như sau.
Đầu tiên hãy khai báo chuỗi của chúng tôi, nếu bây giờ được biết đến như một ngôi sao char,
và gọi nó s.
Cho phép tiếp theo nhắc nhở người dùng cho một chuỗi, như với "chuỗi xin vui lòng." Và
bây giờ chúng ta có được những chuỗi từ người sử dụng sử dụng scanf, báo giá unquote, "% s". Trong
Nói cách khác, chúng ta hãy thông báo cho chúng tôi rằng scanf trên thực tế có hy vọng để có được một chuỗi
từ người sử dụng.
>> Nhưng bây giờ chúng tôi cần phải nói cho scanf một điều khác -
nơi để đặt các chuỗi người dùng cung cấp.
Vâng, tôi sẽ khá đơn giản bắt đầu với dấu phẩy s, quy định cụ thể mà tôi muốn
scanf để đặt chuỗi đó.
Tôi tiếp theo sẽ in ra một cái gì đó như printf "cảm ơn cho% s
dấu gạch chéo ngược n dấu phẩy. "Và như mọi khi, tôi sẽ vượt qua trong chuỗi, s.
Bây giờ chúng ta tiết kiệm, biên dịch và chạy chương trình, và xem nếu chúng ta không có thể gây ra
vấn đề tôi dự đoán.
>> Làm cho scanf-1.
./scanf-1.
Chuỗi xin vui lòng.
Hãy cung cấp một cái gì đó như "xin chào". "Cảm ơn các null." Hmm, đó không phải là
những gì tôi mong đợi.
Vì vậy, những gì đang xảy ra ở đây?
>> Vâng, nó quay ra bởi vì chúng tôi tuyên bố như là một ngôi sao char nhưng chúng tôi đã không
thực sự được lưu trữ trong s địa chỉ của một đoạn thực tế của bộ nhớ, scanf không
có nơi nào để đưa chuỗi mà người dùng đánh máy in
Thật vậy, nếu người dùng là đến nay gõ một chuỗi dài hơn nhiều so với "hello"
Ví dụ một vài dòng văn bản hoặc một số đoạn văn bản, nó khá
có thể là chúng ta có thể tạo ra một cái gọi là lỗi phân khúc.
>> Vì scanf sẽ không biết rằng Tôi đã không thực sự đặt một địa chỉ
bên trong của s.
Thay vào đó, nó sẽ nhìn thấy một số giá trị trong s, một số mô hình của các bit mà có thể
rất tốt là một giá trị rác, có một cách ngẫu nhiên.
Và scanf vẫn sẽ cố gắng viết chuỗi sử dụng địa chỉ đó,
ngay cả khi nó là một giá trị rác, mà thực sự có thể gây ra một vụ tai nạn.
>> Vậy làm thế nào chúng ta sẽ sửa lỗi này?