std::cin.getline() и выход за границы массива

При изучении оператора cin.getline, обнаружил, что он позволяет ввести строку с количеством символов выходящего за границы массива. однако, при вводе обычного cin, это чревато крашем.

#include <iostream>
#include <cstring>
int main()
{
    const int Size = 20;
    char pass[Size];
    std::cout << "The password should include minimum 5 letters" << std::endl;
    std::cout << "Enter the password ";
    std::cin.getline(pass, 20);
    if (strlen(pass) < 5) {
        std::cout << "The password is too short";
    }
    else {
        std::cout << "Success";
    }  
}

вот я написал код, чисто чтобы понять как работает cin.getline()


Ответы (1 шт):

Автор решения: Serge3leo

Как бы, да, чревато.

В вашем коде, максимальная длина введённой строки - 19 символов, что случайно совпало с максимальной ёмкостью массива char pass[Size], но если ваш код слегка видоизменить: std::cin.getline(pass, 42);, то сможет выйти за границы массива, без всяких предупреждений. И краш будет, SIGABRT/SIGBUS/SIGSEGV, любой, на выбор.

Как бы, если есть определённая паранойя, то стоило бы написать так:

    std::cin.getline(pass, std::size(pass));

Или, как вариант:

    std::string pass;
    std::getline(std::cin, pass);

Хотя, конечно, при длинных строках, этот вариант не упадёт, но может использовать много памяти.

→ Ссылка