2 00:00:00,000 --> 00:00:01,860 >> 1 głośnik: Rzućmy okiem w bibliotece CS50, 3 00:00:01,860 --> 00:00:05,190 zwłaszcza jego funkcja GetInt. 4 00:00:05,190 --> 00:00:07,820 Tutaj mamy rzeczywistego źródła Kod dla GetInt. 5 00:00:07,820 --> 00:00:12,050 I zauważyć, że to nie jest zbyt długi, a większość z nich stanowi pętli while - 6 00:00:12,050 --> 00:00:15,620 nieskończonej pętli na to - że tylko Zwraca wartość, gdy rzeczywiście mamy 7 00:00:15,620 --> 00:00:17,400 zdobyć to, czego oczekiwaliśmy. 8 00:00:17,400 --> 00:00:18,700 Przejdźmy przez to. 9 00:00:18,700 --> 00:00:21,650 >> Zauważ tu pierwszy, gdy zaczyna pętlę. 10 00:00:21,650 --> 00:00:25,390 Zauważ, że mamy następny wiersz kodu że faktycznie nazywa GetString, 11 00:00:25,390 --> 00:00:29,620 i zapisuje zwróconą wartość w Zmienna, zwana linia, typu string. 12 00:00:29,620 --> 00:00:31,210 Następnie zrobić trochę o sprawdzenie poprawności. 13 00:00:31,210 --> 00:00:35,770 Jeśli linia == null, to ciekawie powrót INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Teraz okazuje się, że INT_MAX jest Specjalne stałe zadeklarowane w innym miejscu 15 00:00:40,140 --> 00:00:44,030 , który określa największa int, które można reprezentować w 16 00:00:44,030 --> 00:00:45,160 Program taki jak ten. 17 00:00:45,160 --> 00:00:49,430 Teraz mamy arbitralnie postanowił wrócić INT_MAX jako wartość Stróż 18 00:00:49,430 --> 00:00:53,120 rodzaju, który mamy zarezerwowane w co oznacza, że ​​wystąpił błąd. 19 00:00:53,120 --> 00:00:56,230 Tak więc cena, jaką płacimy, jest oczywiście że GetInt najwyraźniej nie może 20 00:00:56,230 --> 00:01:01,440 faktycznie zwróci liczbę tak duży, jak INT_MAX, bo nawet, jeśli chce, 21 00:01:01,440 --> 00:01:04,730 że wartość zwrotna powinna naprawdę być interpretowane przez rozmówcę - 22 00:01:04,730 --> 00:01:06,260 kto używa GetInt - 23 00:01:06,260 --> 00:01:09,340 jako błąd jakiegoś. 24 00:01:09,340 --> 00:01:13,840 >> Następnie zauważył, że już zadeklarowane int n i char c. 25 00:01:13,840 --> 00:01:18,030 W tej kolejnej linii kodu, wzywam Funkcja o nazwie sscanf, przekazując 26 00:01:18,030 --> 00:01:18,970 cztery argumenty. 27 00:01:18,970 --> 00:01:25,110 Linia, która jest ciągiem użytkownika wpisany w "% i% c", który jest formatem 28 00:01:25,110 --> 00:01:28,850 Ciąg, który spodziewam Potęga obsługi typ, a następnie adres 29 00:01:28,850 --> 00:01:30,920 n, i adres c. 30 00:01:30,920 --> 00:01:34,860 Celem teraz sscanf w życiu jest naprawdę zeskanować ciąg szukasz 31 00:01:34,860 --> 00:01:38,700 szczególności format programista został określony jako ten drugi argument. 32 00:01:38,700 --> 00:01:42,020 W tym przypadku,% i jest tam, jak to% węgla. 33 00:01:42,020 --> 00:01:46,700 Więc jeśli sscanf napotyka w int wejście użytkownika, które będą przechowywane int 34 00:01:46,700 --> 00:01:50,270 wewnątrz zmiennej o nazwie n, ponieważ podajemy jako trzeci 35 00:01:50,270 --> 00:01:52,810 argument sscanf adres n. 36 00:01:52,810 --> 00:01:56,870 Co oznacza, że ​​może rzeczywiście przejść sscanf tam, i zaktualizować wartość w nim. 37 00:01:56,870 --> 00:01:59,990 >> Teraz, w przypadku, gdy użytkownik wpisze w coś więcej 38 00:01:59,990 --> 00:02:01,220 od jednego lub większej liczby cyfr - 39 00:02:01,220 --> 00:02:03,570 innymi słowy, char jakiegoś - 40 00:02:03,570 --> 00:02:07,940 że druga zmienna c, której adres mijaliśmy do sscanf jako jej czwarty 41 00:02:07,940 --> 00:02:10,560 Argument będzie również wypełnione. 42 00:02:10,560 --> 00:02:14,220 Teraz górą od sprawdzania dodatkowy znak od użytkownika jest 43 00:02:14,220 --> 00:02:17,360 że jeśli on lub ona nie współpracować, i typy w więcej niż int, 44 00:02:17,360 --> 00:02:20,530 będziemy w stanie wykryć w ten sposób, ponieważ w tym przypadku, sscanf 45 00:02:20,530 --> 00:02:24,860 zamierza powrócić 2, co oznacza, że oba były pełne symboli zastępczych 46 00:02:24,860 --> 00:02:25,600 z wartościami. 47 00:02:25,600 --> 00:02:30,360 Ale mamy nadzieję, że zamiast tego sscanf Zwraca 1, co oznacza tylko użytkownik 48 00:02:30,360 --> 00:02:31,630 pod warunkiem, int. 49 00:02:31,630 --> 00:02:34,480 >> Co zrobimy, jeśli sscanf rzeczywiście zwraca 1? 50 00:02:34,480 --> 00:02:39,150 Cóż, my natychmiast uwolnić linię użytkownik wpisany, a potem 51 00:02:39,150 --> 00:02:42,670 natychmiast powrócić n, o zdobyć int. 52 00:02:42,670 --> 00:02:47,180 Indziej, jeśli sscanf nie zwraca 1, a Użytkownik zatem nie współpracował, 53 00:02:47,180 --> 00:02:51,470 nadal zwalniać linię, ale teraz poprosi użytkownika, aby ponowić. 54 00:02:51,470 --> 00:02:55,390 I dlatego, że jesteśmy w środku, że nadal inaczej pętla nieskończona, proces 55 00:02:55,390 --> 00:03:00,190 rozpocznie się ponownie i może ponownie i Może znowu, dopóki użytkownik faktycznie 56 00:03:00,190 --> 00:03:01,500 zapewnia nam int. 57 00:03:01,500 --> 00:03:21,490