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 шт):
Как бы, да, чревато.
В вашем коде, максимальная длина введённой строки - 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);
Хотя, конечно, при длинных строках, этот вариант не упадёт, но может использовать много памяти.