>> დინამიკები 1: მოდით შევხედოთ at CS50 ბიბლიოთეკა,
კერძოდ, მისი GetInt ფუნქცია.
აქ ჩვენ გვაქვს ფაქტობრივი წყარო კოდი GetInt.
და შეამჩნია, რომ ეს არ არის ძალიან ხანგრძლივი და ყველაზე მეტად ის წარმოადგენს, ხოლო loop -
უსასრულო loop რომ - რომ მხოლოდ დააბრუნებს ღირებულება ერთხელ ჩვენ რეალურად
მიღებული რასაც ველოდით.
მოდით გავლა იგი.
>> გაითვალისწინეთ, აქ პირველ რიგში, ხოლო loop იწყება.
ყურადღება მიაქციეთ შემდეგ, რომ ჩვენ გვაქვს ხაზი კოდი რომ რეალურად მოუწოდებს GetString,
და ინახავს დაბრუნების ღირებულების ცვლადი, მოუწოდა ხაზი, ტიპის string.
ჩვენ მაშინ ამის გაკეთება ცოტა საღი აზრის ქვითარი.
თუ ხაზი == null, მაშინ ჩვენ საინტერესოა დაბრუნების INT_MAX.
>> ახლა გამოდის, რომ INT_MAX არის სპეციალური მუდმივი განაცხადა სხვაგან
რომელიც განსაზღვრავს უდიდესი შესაძლო int, რომ თქვენ შეგიძლიათ წარმოადგენენ
პროგრამა მოსწონს ეს.
ახლა ჩვენ თვითნებურად გადაწყვიტა დაბრუნდეს INT_MAX როგორც Sentinel ღირებულება
სახის, ერთი, რომ ჩვენ დაცულია როგორც რაც იმას ნიშნავს, შეცდომა მოხდა.
ასე რომ ფასი ჩვენ ეწვევა, რა თქმა უნდა, რომ GetInt შეიძლება აშკარად არ
რეალურად დაბრუნებას ნომერი, როგორც დიდი, როგორც INT_MAX, რადგან მაშინაც კი, თუ მას სურს,
რომ დაბრუნების ღირებულება ნამდვილად უნდა უნდა განიმარტოს მიერ აბონენტის -
ვინც გამოყენებით GetInt -
როგორც შეცდომა გარკვეული.
>> შემდეგი შეამჩნევთ, რომ მე განაცხადა int n და char c.
ამ შემდეგი ხაზი კოდი, მოვუწოდებ ფუნქცია მოუწოდა sscanf, გადადის
ოთხი არგუმენტები.
ხაზი, რომელიც სიმებიანი მომხმარებლის აკრეფილი, "% i% c", რომელიც ფორმატში
სიმებიანი რომ მე ველოდებით მომხმარებლის სიძლიერეზე ტიპის, რასაც მოჰყვა მისამართი
n, და მისამართი გ.
ახლა sscanf მიზანი ცხოვრებაში ნამდვილად არის სკანირების სიმებიანი ეძებს
კერძოდ ფორმატში, რომ პროგრამისტი უკვე განსაზღვრულია, რომ მეორე არგუმენტი.
ამ შემთხვევაში,% i არის იქ, როგორც% c.
ასე რომ, თუ sscanf შეტაკებები int წელს მომხმარებლის input, რომ int იქნება შენახული
შიგნით ცვლადში n, რადგან ჩვენ გათვალისწინებული მესამე
არგუმენტი sscanf მისამართი n.
რაც ნიშნავს, რომ sscanf შეიძლება მართლაც წავიდეს იქ, განახლება და ღირებულება მასში.
>> ახლა, იმ შემთხვევაში, თუ მომხმარებლის ტიპის რაღაც უფრო მეტი
ვიდრე ერთი ან მეტი ციფრისგან -
სხვა სიტყვებით, char გარკვეული -
რომ მეორე ცვლადი c, რომლის მისამართი ჩვენ შევიდა sscanf როგორც მისი მეოთხე
არგუმენტი ასევე იქნება დასახლებული.
ახლა upside of შემოწმება დამატებითი ხასიათი მომხმარებელი
რომ თუ იგი არ ითანამშრომლებს, და სახეები უფრო მეტია ვიდრე უბრალოდ int,
ჩვენ შევძლებთ, რომ აღმოაჩინოს, რომ ამ წესით, რადგან ამ შემთხვევაში, sscanf
დაბრუნებას აპირებს 2 აუწყებდა, რომ ორივე placeholders ივსებოდა
ფასეულობებით.
მაგრამ ჩვენ იმედი გვაქვს, რომ sscanf ნაცვლად დააბრუნებს 1, რაც იმას ნიშნავს, რომ მომხმარებელს მხოლოდ
იმ პირობით, int.
>> რა ვქნათ, თუ sscanf მართლაც ბრუნდება 1?
ასევე, ჩვენ დაუყოვნებლივ გასათავისუფლებლად ხაზი, მომხმარებლის აკრეფილი, და მაშინ ჩვენ
დაუყოვნებლივ დაბრუნებას n, რომელსაც მიღებული int.
სხვაგან, თუ sscanf არ დაბრუნდება 1 და მომხმარებლის ამიტომ არ ითანამშრომლებს,
ჩვენ ჯერ კიდევ გასათავისუფლებლად ხაზი, მაგრამ ჩვენ ახლა შეეკითხება მომხმარებელს კვლავ სცადოთ.
და იმიტომ, რომ ჩვენ ჯერ კიდევ შიგნით რომ წინააღმდეგ შემთხვევაში უსასრულო ციკლი, პროცესი
დაიწყება ისევ, და იქნებ ერთხელ და იქნებ ერთხელ, სანამ მომხმარებლის რეალურად
გვაძლევს int.