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