1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> დინამიკები 1: მოდით დავწეროთ პროგრამა, რომელიც იღებს string საწყისი მომხმარებლის გარეშე 3 00:00:02,920 --> 00:00:05,700 გამოყენებით CS50 ბიბლიოთეკის ფუნქციონირებს GetString. 4 00:00:05,700 --> 00:00:08,720 ამისათვის, ჩვენ წავიდეთ წინ და გამოიყენოთ scanf, ფუნქცია, რომ GetString 5 00:00:08,720 --> 00:00:10,950 ფუნქცია რეალურად იყენებს ქვევმოთ hood. 6 00:00:10,950 --> 00:00:13,780 მაგრამ მე ვაპირებ ამის გაკეთება შეგნებულად in a buggy გზა. 7 00:00:13,780 --> 00:00:17,230 მე ვაპირებ ამის გაკეთებას ისე, რომ მე ვფიქრობ, იქნება სწორი, მაგრამ აღმოჩნდება, რომ 8 00:00:17,230 --> 00:00:19,380 ჩემი ვარაუდია აპირებს საკმაოდ, საკმაოდ სრულყოფილი. 9 00:00:19,380 --> 00:00:20,800 და რეალურად, საკმაოდ საშიშია. 10 00:00:20,800 --> 00:00:24,750 იმის გამო, რომ შეცდომები, როგორიც მე ვარ შესახებ რათა შეიძლება გამოყენებული მიერ მოწინააღმდეგეებს 11 00:00:24,750 --> 00:00:28,870 ისეთი, რომ თქვენი მანქანა, თქვენი პროგრამა შეიძლება აიღო პოტენციურად. 12 00:00:28,870 --> 00:00:30,200 >> მოდით დავიწყოთ შემდეგნაირად. 13 00:00:30,200 --> 00:00:33,540 პირველი მოდით გამოვაცხადო ჩვენი სიმებიანი, სხვაგვარად ცნობილია, როგორც char ვარსკვლავი, 14 00:00:33,540 --> 00:00:34,750 და მას s. 15 00:00:34,750 --> 00:00:39,400 შეკითხვა მომავალ შეეკითხება მომხმარებელს ამისთვის სიმებიანი, როგორც "string გთხოვთ." და 16 00:00:39,400 --> 00:00:44,250 მოდით ახლა მიიღოს სიმებიანი საწყისი მომხმარებელი გამოყენებით scanf, ციტირებით unquote, "% s." In 17 00:00:44,250 --> 00:00:47,760 სხვა სიტყვებით რომ ვთქვათ, მოდით ინფორმირება scanf, რომ ჩვენ არ რეალურად ველოდოთ მიიღოს სიმებიანი 18 00:00:47,760 --> 00:00:48,630 საწყისი მომხმარებელს. 19 00:00:48,630 --> 00:00:50,810 >> მაგრამ ჩვენ ახლა უნდა ვუთხრა scanf კიდევ ერთი რამ - 20 00:00:50,810 --> 00:00:53,350 სად უნდა დააყენოს სიმებიანი რომ მომხმარებელს უზრუნველყოფს. 21 00:00:53,350 --> 00:00:57,840 ისე, მე ვაპირებ უბრალოდ დაიწყოს ერთად მძიმით s, მიუთითებს, რომ მინდა 22 00:00:57,840 --> 00:00:59,320 scanf დააყენა სიმებიანი არსებობს. 23 00:00:59,320 --> 00:01:04,818 მე მომდევნო აპირებს ამობეჭდოთ რაღაც მოსწონს printf "მადლობა% s 24 00:01:04,818 --> 00:01:10,670 backslash n მძიმით. "და როგორც ყოველთვის, მე ვარ აპირებს გაიაროს სიმებიანი, s. 25 00:01:10,670 --> 00:01:14,920 ახლა მოდით გადარჩენა, კომპილირდება და აწარმოებს ამ პროგრამა, და თუ ჩვენ ვერ გამოიწვიოს 26 00:01:14,920 --> 00:01:16,590 პრობლემა მე იწინასწარმეტყველა. 27 00:01:16,590 --> 00:01:18,650 >> რათა scanf 1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 სიმებიანი გთხოვთ. 30 00:01:21,830 --> 00:01:25,540 მოდით გთავაზობთ რაღაც, "Hello". "მადლობა null." Hmm, რომ არ არის 31 00:01:25,540 --> 00:01:26,750 რა ელოდება. 32 00:01:26,750 --> 00:01:28,240 ასე რომ, რა ხდება აქ? 33 00:01:28,240 --> 00:01:32,040 >> ასევე, თურმე იმიტომ, რომ განაცხადა, s როგორც char ვარსკვლავი, მაგრამ ჩვენ არ 34 00:01:32,040 --> 00:01:36,120 რეალურად ინახება ნანახია მისამართი ფაქტობრივი ბლოკი მეხსიერება, scanf არ 35 00:01:36,120 --> 00:01:38,940 აქვს არსად დააყენოს string რომ მომხმარებლის აკრეფილი შემოსული 36 00:01:38,940 --> 00:01:42,510 მართლაც, თუ მომხმარებელი იყო, ახლა აკრიფოთ ბევრად უფრო string მეტი "Hello", 37 00:01:42,510 --> 00:01:46,780 მაგალითად, რამდენიმე ხაზი ტექსტი ან რამდენიმე აბზაცი ტექსტი, საკმაოდ 38 00:01:46,780 --> 00:01:50,280 შესაძლებელია, რომ ჩვენ შეიძლება გამოიწვიოს ე.წ. სეგმენტაცია ბრალია. 39 00:01:50,280 --> 00:01:53,570 >> იმის გამო, რომ scanf არ აპირებს იცით, რომ მე არ რეალურად დააყენა მისამართი 40 00:01:53,570 --> 00:01:54,610 შიგნით s. 41 00:01:54,610 --> 00:01:58,000 უფრო მეტიც, ის აპირებს, რომ ზოგიერთი ღირებულება in s, ზოგიერთი ნიმუში ბიტი, რომ შეიძლება 42 00:01:58,000 --> 00:02:00,910 ძალიან კარგად იყოს ნაგვის ღირებულება, არსებობს მხოლოდ შანსი. 43 00:02:00,910 --> 00:02:04,600 და scanf კვლავ აპირებს ცდილობენ დაწერა მომხმარებლის string რომ მისამართი, 44 00:02:04,600 --> 00:02:08,789 თუნდაც ის ნაგვის ღირებულება, რომელიც შეიძლება მართლაც გამოიწვიოს ავარიის. 45 00:02:08,789 --> 00:02:10,130 >> ასე რომ, როგორ მივდივართ დაფიქსირება ამ? 46 00:02:10,130 --> 00:02:12,523