>> 1 głośnik: Rzućmy okiem w bibliotece CS50,
zwłaszcza jego funkcja GetInt.
Tutaj mamy rzeczywistego źródła Kod dla GetInt.
I zauważyć, że to nie jest zbyt długi, a większość z nich stanowi pętli while -
nieskończonej pętli na to - że tylko Zwraca wartość, gdy rzeczywiście mamy
zdobyć to, czego oczekiwaliśmy.
Przejdźmy przez to.
>> Zauważ tu pierwszy, gdy zaczyna pętlę.
Zauważ, że mamy następny wiersz kodu że faktycznie nazywa GetString,
i zapisuje zwróconą wartość w Zmienna, zwana linia, typu string.
Następnie zrobić trochę o sprawdzenie poprawności.
Jeśli linia == null, to ciekawie powrót INT_MAX.
>> Teraz okazuje się, że INT_MAX jest Specjalne stałe zadeklarowane w innym miejscu
, który określa największa int, które można reprezentować w
Program taki jak ten.
Teraz mamy arbitralnie postanowił wrócić INT_MAX jako wartość Stróż
rodzaju, który mamy zarezerwowane w co oznacza, że ​​wystąpił błąd.
Tak więc cena, jaką płacimy, jest oczywiście że GetInt najwyraźniej nie może
faktycznie zwróci liczbę tak duży, jak INT_MAX, bo nawet, jeśli chce,
że wartość zwrotna powinna naprawdę być interpretowane przez rozmówcę -
kto używa GetInt -
jako błąd jakiegoś.
>> Następnie zauważył, że już zadeklarowane int n i char c.
W tej kolejnej linii kodu, wzywam Funkcja o nazwie sscanf, przekazując
cztery argumenty.
Linia, która jest ciągiem użytkownika wpisany w "% i% c", który jest formatem
Ciąg, który spodziewam Potęga obsługi typ, a następnie adres
n, i adres c.
Celem teraz sscanf w życiu jest naprawdę zeskanować ciąg szukasz
szczególności format programista został określony jako ten drugi argument.
W tym przypadku,% i jest tam, jak to% węgla.
Więc jeśli sscanf napotyka w int wejście użytkownika, które będą przechowywane int
wewnątrz zmiennej o nazwie n, ponieważ podajemy jako trzeci
argument sscanf adres n.
Co oznacza, że ​​może rzeczywiście przejść sscanf tam, i zaktualizować wartość w nim.
>> Teraz, w przypadku, gdy użytkownik wpisze w coś więcej
od jednego lub większej liczby cyfr -
innymi słowy, char jakiegoś -
że druga zmienna c, której adres mijaliśmy do sscanf jako jej czwarty
Argument będzie również wypełnione.
Teraz górą od sprawdzania dodatkowy znak od użytkownika jest
że jeśli on lub ona nie współpracować, i typy w więcej niż int,
będziemy w stanie wykryć w ten sposób, ponieważ w tym przypadku, sscanf
zamierza powrócić 2, co oznacza, że oba były pełne symboli zastępczych
z wartościami.
Ale mamy nadzieję, że zamiast tego sscanf Zwraca 1, co oznacza tylko użytkownik
pod warunkiem, int.
>> Co zrobimy, jeśli sscanf rzeczywiście zwraca 1?
Cóż, my natychmiast uwolnić linię użytkownik wpisany, a potem
natychmiast powrócić n, o zdobyć int.
Indziej, jeśli sscanf nie zwraca 1, a Użytkownik zatem nie współpracował,
nadal zwalniać linię, ale teraz poprosi użytkownika, aby ponowić.
I dlatego, że jesteśmy w środku, że nadal inaczej pętla nieskończona, proces
rozpocznie się ponownie i może ponownie i Może znowu, dopóki użytkownik faktycznie
zapewnia nam int.