>> დინამიკები 1: მოდით დავწეროთ პროგრამა, რომელიც იღებს string საწყისი მომხმარებლის გარეშე
გამოყენებით CS50 ბიბლიოთეკის ფუნქციონირებს GetString.
ამისათვის, ჩვენ წავიდეთ წინ და გამოიყენოთ scanf, ფუნქცია, რომ GetString
ფუნქცია რეალურად იყენებს ქვევმოთ hood.
მაგრამ მე ვაპირებ ამის გაკეთება შეგნებულად in a buggy გზა.
მე ვაპირებ ამის გაკეთებას ისე, რომ მე ვფიქრობ, იქნება სწორი, მაგრამ აღმოჩნდება, რომ
ჩემი ვარაუდია აპირებს საკმაოდ, საკმაოდ სრულყოფილი.
და რეალურად, საკმაოდ საშიშია.
იმის გამო, რომ შეცდომები, როგორიც მე ვარ შესახებ რათა შეიძლება გამოყენებული მიერ მოწინააღმდეგეებს
ისეთი, რომ თქვენი მანქანა, თქვენი პროგრამა შეიძლება აიღო პოტენციურად.
>> მოდით დავიწყოთ შემდეგნაირად.
პირველი მოდით გამოვაცხადო ჩვენი სიმებიანი, სხვაგვარად ცნობილია, როგორც char ვარსკვლავი,
და მას s.
შეკითხვა მომავალ შეეკითხება მომხმარებელს ამისთვის სიმებიანი, როგორც "string გთხოვთ." და
მოდით ახლა მიიღოს სიმებიანი საწყისი მომხმარებელი გამოყენებით scanf, ციტირებით unquote, "% s." In
სხვა სიტყვებით რომ ვთქვათ, მოდით ინფორმირება scanf, რომ ჩვენ არ რეალურად ველოდოთ მიიღოს სიმებიანი
საწყისი მომხმარებელს.
>> მაგრამ ჩვენ ახლა უნდა ვუთხრა scanf კიდევ ერთი რამ -
სად უნდა დააყენოს სიმებიანი რომ მომხმარებელს უზრუნველყოფს.
ისე, მე ვაპირებ უბრალოდ დაიწყოს ერთად მძიმით s, მიუთითებს, რომ მინდა
scanf დააყენა სიმებიანი არსებობს.
მე მომდევნო აპირებს ამობეჭდოთ რაღაც მოსწონს printf "მადლობა% s
backslash n მძიმით. "და როგორც ყოველთვის, მე ვარ აპირებს გაიაროს სიმებიანი, s.
ახლა მოდით გადარჩენა, კომპილირდება და აწარმოებს ამ პროგრამა, და თუ ჩვენ ვერ გამოიწვიოს
პრობლემა მე იწინასწარმეტყველა.
>> რათა scanf 1.
./scanf-1.
სიმებიანი გთხოვთ.
მოდით გთავაზობთ რაღაც, "Hello". "მადლობა null." Hmm, რომ არ არის
რა ელოდება.
ასე რომ, რა ხდება აქ?
>> ასევე, თურმე იმიტომ, რომ განაცხადა, s როგორც char ვარსკვლავი, მაგრამ ჩვენ არ
რეალურად ინახება ნანახია მისამართი ფაქტობრივი ბლოკი მეხსიერება, scanf არ
აქვს არსად დააყენოს string რომ მომხმარებლის აკრეფილი შემოსული
მართლაც, თუ მომხმარებელი იყო, ახლა აკრიფოთ ბევრად უფრო string მეტი "Hello",
მაგალითად, რამდენიმე ხაზი ტექსტი ან რამდენიმე აბზაცი ტექსტი, საკმაოდ
შესაძლებელია, რომ ჩვენ შეიძლება გამოიწვიოს ე.წ. სეგმენტაცია ბრალია.
>> იმის გამო, რომ scanf არ აპირებს იცით, რომ მე არ რეალურად დააყენა მისამართი
შიგნით s.
უფრო მეტიც, ის აპირებს, რომ ზოგიერთი ღირებულება in s, ზოგიერთი ნიმუში ბიტი, რომ შეიძლება
ძალიან კარგად იყოს ნაგვის ღირებულება, არსებობს მხოლოდ შანსი.
და scanf კვლავ აპირებს ცდილობენ დაწერა მომხმარებლის string რომ მისამართი,
თუნდაც ის ნაგვის ღირებულება, რომელიც შეიძლება მართლაც გამოიწვიოს ავარიის.
>> ასე რომ, როგორ მივდივართ დაფიქსირება ამ?