2 00:00:00,000 --> 00:00:01,860 >> СПИКЕР 1: Давайте взглянем в библиотеке CS50, 3 00:00:01,860 --> 00:00:05,190 в частности, ее функция GetInt. 4 00:00:05,190 --> 00:00:07,820 Здесь мы имеем фактический источник код GetInt. 5 00:00:07,820 --> 00:00:12,050 И заметьте, что это не слишком долго, и большинство из них представляет какое-то время цикла - 6 00:00:12,050 --> 00:00:15,620 бесконечный цикл при этом - что только возвращает значение, как только мы на самом деле 7 00:00:15,620 --> 00:00:17,400 получили то, что мы ожидали. 8 00:00:17,400 --> 00:00:18,700 Давайте идти через него. 9 00:00:18,700 --> 00:00:21,650 >> Обратите внимание, здесь во-первых, в то время как начинается цикл. 10 00:00:21,650 --> 00:00:25,390 Обратите внимание, в следующем, что у нас есть строки кода что на самом деле вызывает GetString, 11 00:00:25,390 --> 00:00:29,620 и сохраняет возвращаемого значения в переменная, называемая линия, тип строка. 12 00:00:29,620 --> 00:00:31,210 Затем мы делаем немного есть простой тест. 13 00:00:31,210 --> 00:00:35,770 Если линия == NULL, то мы с любопытством вернуться INT_MAX. 14 00:00:35,770 --> 00:00:40,140 >> Теперь оказывается, что INT_MAX является специальная константа объявлена ​​в другом месте 15 00:00:40,140 --> 00:00:44,030 , который определяет максимально возможное Int, что можно представить в 16 00:00:44,030 --> 00:00:45,160 Программа так. 17 00:00:45,160 --> 00:00:49,430 Теперь мы произвольно решил вернуться INT_MAX как значение дозорного из 18 00:00:49,430 --> 00:00:53,120 виды, тот, который мы защищены как это означает, что произошла ошибка. 19 00:00:53,120 --> 00:00:56,230 Таким образом, цена, которую мы платить, конечно, что GetInt видимому, не могут 20 00:00:56,230 --> 00:01:01,440 на самом деле возвращают число такого размера, как INT_MAX, потому что даже если она хочет, 21 00:01:01,440 --> 00:01:04,730 что возвращаемое значение должно действительно интерпретироваться вызывающей - 22 00:01:04,730 --> 00:01:06,260 кто использует GetInt - 23 00:01:06,260 --> 00:01:09,340 как ошибка какой-то. 24 00:01:09,340 --> 00:01:13,840 >> Далее, обратите внимание, что я объявил Int N и символ с. 25 00:01:13,840 --> 00:01:18,030 В этом следующей строке кода, я называю Функция называется Sscanf, передавая 26 00:01:18,030 --> 00:01:18,970 четыре аргумента. 27 00:01:18,970 --> 00:01:25,110 линия, которая является строка пользователя ввели в "% I% С", который является форматом 28 00:01:25,110 --> 00:01:28,850 Строка, я ожидаю пользователь может тип, за которым следует адрес 29 00:01:28,850 --> 00:01:30,920 п, а также адрес в. 30 00:01:30,920 --> 00:01:34,860 Теперь Sscanf'S цель в жизни, действительно для сканирования строку ищете 31 00:01:34,860 --> 00:01:38,700 конкретный формат, что программист уточнил, как этого второго аргумента. 32 00:01:38,700 --> 00:01:42,020 В этом случае,% I находится в там, как% с. 33 00:01:42,020 --> 00:01:46,700 Так что если Sscanf встречает Int в вход пользователя, что внутр будет храниться 34 00:01:46,700 --> 00:01:50,270 внутри переменной называется п, потому что мы обеспечили как третий 35 00:01:50,270 --> 00:01:52,810 Аргумент Sscanf адрес п. 36 00:01:52,810 --> 00:01:56,870 Это означает, что Sscanf действительно может пойти там, и обновить значение в нем. 37 00:01:56,870 --> 00:01:59,990 >> Теперь, в случае пользователь вводит в нечто большее, 38 00:01:59,990 --> 00:02:01,220 чем одна или несколько цифр - 39 00:02:01,220 --> 00:02:03,570 другими словами, символ какой-то - 40 00:02:03,570 --> 00:02:07,940 что вторая переменная с, чей адрес мы прошли в Sscanf как четвертый 41 00:02:07,940 --> 00:02:10,560 аргумент также будет заселена. 42 00:02:10,560 --> 00:02:14,220 Теперь с ног проверок Дополнительный персонаж от пользователя является 43 00:02:14,220 --> 00:02:17,360 что если он или она не будет сотрудничать, и типы в больше, чем просто Int, 44 00:02:17,360 --> 00:02:20,530 мы будем в состоянии обнаружить его в этом образом, поскольку в этом случае, Sscanf 45 00:02:20,530 --> 00:02:24,860 собирается вернуться 2, показывая, что оба заполнителей были заполнены 46 00:02:24,860 --> 00:02:25,600 со значениями. 47 00:02:25,600 --> 00:02:30,360 Но мы надеемся, что Sscanf вместо возвращает 1, что означает, только пользователю 48 00:02:30,360 --> 00:02:31,630 предоставил Int. 49 00:02:31,630 --> 00:02:34,480 >> Что нам делать, если Sscanf действительно возвращает 1? 50 00:02:34,480 --> 00:02:39,150 Ну, мы немедленно освободить линию, пользователь ввел в, и тогда мы 51 00:02:39,150 --> 00:02:42,670 немедленно вернуться п, имеющих получил письмо Int. 52 00:02:42,670 --> 00:02:47,180 В противном случае, если Sscanf не возвращает 1, и пользователь поэтому не сотрудничать, 53 00:02:47,180 --> 00:02:51,470 мы по-прежнему освободить линию, но мы теперь предложит пользователю повторить. 54 00:02:51,470 --> 00:02:55,390 И потому, что мы все еще внутри, что в противном случае бесконечный цикл, процесс 55 00:02:55,390 --> 00:03:00,190 начнется снова, и, возможно, снова, и может быть снова, пока пользователь на самом деле 56 00:03:00,190 --> 00:03:01,500 предоставляет нам Int. 57 00:03:01,500 --> 00:03:21,490