>> СПІКЕР 1: Давайте поглянемо в бібліотеці CS50,
зокрема, її функція GetInt.
Тут ми маємо фактичний джерело код GetInt.
І зауважте, що це не надто довго, і більшість з них представляє якийсь час циклу -
нескінченний цикл при цьому - що тільки повертає значення, як тільки ми насправді
отримали те, що ми очікували.
Давайте йти через нього.
>> Зверніть увагу, тут по-перше, в той час як починається цикл.
Зверніть увагу, в наступному, що у нас є рядки коду що насправді викликає GetString,
і зберігає значення, що повертається в змінна, звана лінія, тип рядок.
Потім ми робимо трохи є простий тест.
Якщо лінія == NULL, то ми з цікавістю повернутися INT_MAX.
>> Тепер виявляється, що INT_MAX є спеціальна константа оголошена в іншому місці
, Який визначає максимально можливе Int, що можна представити у
Програма так.
Тепер ми довільно вирішив повернутися INT_MAX як значення дозорного з
види, той, який ми захищені як це означає, що сталася помилка.
Таким чином, ціна, яку ми платити, звичайно, що GetInt мабуть, не можуть
насправді повертають число такого розміру, як INT_MAX, тому що навіть якщо вона хоче,
що повертається значення повинно дійсно інтерпретуватися викликає -
хто використовує GetInt -
як помилка якийсь.
>> Далі, зверніть увагу, що я оголосив Int N і символ с.
У цьому наступному рядку коду, я називаю Функція називається Sscanf, передаючи
чотири аргументи.
лінія, яка є рядок користувача ввели в "% I% С", який є форматом
Рядок, я очікую користувач може тип, за яким слід адресу
п, а також адреса в.
Тепер Sscanf'S мета в житті, дійсно для сканування рядок шукаєте
конкретний формат, що програміст уточнив, як цього другого аргументу.
У цьому випадку,% I знаходиться в там, як% с.
Так що якщо Sscanf зустрічає Int в вхід користувача, що внутр буде зберігатися
всередині змінної називається п, тому що ми забезпечили як третій
Аргумент Sscanf адресу п.
Це означає, що Sscanf дійсно може піти там, і оновити значення в ньому.
>> Тепер, у випадку користувач вводить в щось більше,
ніж одна або кілька цифр -
іншими словами, символ якийсь -
що друга змінна з, чия адреса ми пройшли в Sscanf як четвертий
аргумент також буде заселена.
Тепер з ніг перевірок Додатковий персонаж від користувача є
що якщо він або вона не буде співпрацювати, і типи в більше, ніж просто Int,
ми будемо в змозі виявити його в цьому чином, оскільки в цьому випадку, Sscanf
збирається повернутися 2, показуючи, що обидва заповнювачів були заповнені
зі значеннями.
Але ми сподіваємося, що Sscanf замість повертає 1, що означає, тільки користувачеві
надав Int.
>> Що нам робити, якщо Sscanf справді повертає 1?
Ну, ми негайно звільнити лінію, користувач ввів в, і тоді ми
негайно повернутися п, що мають отримав листа Int.
В іншому випадку, якщо Sscanf не вертає 1, і користувач тому не співпрацювати,
ми як і раніше звільнити лінію, але ми тепер запропонує користувачеві повторити.
І тому, що ми все ще всередині, що в іншому випадку нескінченний цикл, процес
почнеться знову, і, можливо, знову, і може бути знову, поки користувач насправді
надає нам Int.