СПІКЕР 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.