Частина 6 - Базовий I/O

Для повного змісту змісту всіх уроків, будь ласка, натисніть нижче, оскільки це надасть вам короткий зміст кожного уроку, а також теми, які будуть обговорені. https://github.com/mytechnotalent/hacking\_c-\_arm64

Сьогодні ми розглянемо базовий I/O C++ програму з мінімальною перевіркою. До того, як я потраплю в коротку лекцію, я хотів пояснити, чому я не використовую приклади з книжки прямо cin, які ви бачите по всьому світу. cin, стандартний потік вхідних даних, який приймає дані з клавіатури, називається нашим stdin. Що робить cin, це використовує білий простір, табуляцію та новий рядок як термінатор потоку вхідних даних. Наприклад, якщо ви ввели 'abc' і натиснули табуляцію або поставили білий простір або новий рядок, натиснувши Enter, дані праворуч від нього будуть проігноровані. Проблема в тому, що якщо ви знову прочитаєте з cin, воно буде підхоплювати залишені дані в потоці, якщо ви не очищуєте буфер вхідних даних. Якщо ви, наприклад, ввели:

std::cin >> val1;
std::cin >> val2;

Якщо користувач ввів 1 і потім залишив білий простір і потім 2 і натиснув Enter, у вас немає жодних проблем. 1 буде призначено до val1 і 2 буде призначено до val2, оскільки вони зв'язані. Проблема в тому, що якщо ви ввели 'Hey Jude' замість цілого числа, що відбувається, воно спробує прочитати ціле число і воно потрапляє в невдалий стан, а від того часу все інше, яке воно витягує, є непередбачуваним. Я не хотів бути довгим, але я дуже хотів підкреслити, чому ви ніколи не повинні використовувати cin самостійно і я маю на увазі ніколи! Давайте розглянемо нашу базову i/o програму, яку ми відлагодимо в наступному урокі з дуже базовою C++ програмою, яка валідує вхідні дані.

#include <iostream>

include <sstream>

include <string>

int main() { int age = 0; bool valid = false; char null = '\0';

while (!valid)
{
    std::cout &lt;&lt; "Enter Age: ";

    // Get input as string
    std::string line;
    getline(std::cin, line);

    // Init stringstream
    std::stringstream is(line);

    // Attempt to read a valid age from the stringstream and
    // if a number can't be read, or there is more than white
    // space in the string after the number, then fail the read
    // and get another string from the user and make sure the 
    // dude is at least a year old and less than or equal to
    // 100 years old
    if (!(is &gt;&gt; age) || (is &gt;&gt; std::ws &amp;&amp; is.get(null)) || age &gt;= 100 || age &lt;= 0)
        std::cout &lt;&lt; "Dude be real!" &lt;&lt; std::endl;
    else
        valid = true;
}

std::cout &lt;&lt; "Your are " &lt;&lt; age &lt;&lt; " years old, seems legit!" &lt;&lt; std::endl;

return 0;

} </pre>

Ми починаємо імпортувати iostream, sstream і string. Такі вже нічого складного. Потім ми просимо користувача ввести свій вік. Потім ми створюємо об'єкт рядка line і користуємося C++ getline(), який є стандартною бібліотекою C++, яка використовується для читання рядка або рядка з потоку вхідних даних належним чином. Потім ми користуємося stringstream, оскільки він асоціює об'єкт рядка з потоком, що дозволяє читати з рядка, як би це було потік, як ми робимо з cin безпосередньо. У цьому простому прикладі ми створюємо об'єкт is (що означає input stringstream) і підключаємо його до нашого об'єкта line. Потім, перш ніж відобразити дані на stdout, ми робимо трохи перевірки. Ми спочатку перевіримо, чи age є типом, яким воно було визначено, тобто цілим числом, чи є білий простір в потоці після цілого числа чи вік більший за 100 чи менше за 0. Вельми просто воно надає відповідь, якщо вхідні дані не відповідають цим критеріям. Нарешті, якщо все добре, воно відображає простий cout. Давайте скомпілюємо і зв'яжемо.

g++ -o 0x02_asm64_basicio 0x02_asm64_basicio.cpp

Давайте запустимо.

./0x02_asm64_basicio

Залежно від того, що ви ввели, воно буде валідувати відповідно до того, що описано вище. БУДЬ ЛАСКА, спробуйте цей приклад і змінюйте джерело, щоб отримати повний розуміння того, що відбувається тут. У наступному урокі ми відлагодимо цю дуже просту бінарну систему за допомогою нашої розробчої збірки Radare2.

results matching ""

    No results matching ""