Почему это работает? Использование cin для чтения в массив символов меньше заданного

Я читаю C ++ Primer Plus (6-е издание) и в главе 4 я наткнулся на некоторый пример кода, о котором у меня возник вопрос:

Листинг 4.2strings.cpp

// strings.cpp -- storing strings in an array
#include <iostream>
#include <cstring> // for the strlen() function
int main()
{
    using namespace std;
    const int Size = 15;
    char name1[Size]; // empty array
    char name2[Size] = "C++owboy"; // initialized array
    // NOTE: some implementations may require the static keyword
    // to initialize the array name2
    cout << "Howdy! I'm " << name2;
    cout << "! What's your name?\n";
    cin >> name1;
    cout << "Well, " << name1 << ", your name has ";
    cout << strlen(name1) << " letters and is stored\n";
    cout << "in an array of " << sizeof(name1) << " bytes.\n";
    cout << "Your initial is " << name1[0] << ".\n";
    name2[3] = '\0'; // set to null character
    cout << "Here are the first 3 characters of my name: ";
    cout << name2 << endl;
    return 0;
}

Код сам по себе не вызывает путаницы, но я его выполнил, и меня смутил определенный сценарий.

name1 инициализируется как массив символов длиной 15 элементов - правильно ли я считаю, что в нем должна содержаться строка длиной 14 символов? Конечный символ должен быть зарезервирован для конца строки, верно?

Если я введу свое имя какHowCanIPossiblyFitThisEntireStringIn?Я получаю следующий вывод:

Привет! Я С ++, парень! Как вас зовут?

HowCanIPossiblyFitThisEntireStringIn?

Ну, как CanIpossblyFitThisEntireStringIn ?, ваше имя имеет 37 букв и хранится

в массиве 15 байтов.

Ваш начальный H.

Вот первые 3 символа моего имени: C ++

Как хранится полное имя, которое я ввожу? Если я пошагово выполняю код после того, как cin читает в name1, Visual Studio сообщает мне, что он содержит элементы 0 - 14, причем последним является символ 'y' ("HowCanIPossbly ...). Я мог бы предположить, что любые дополнительные введенные данные были усечены и потеряны, но это, очевидно, не так, поскольку следующий cout успешно записывает полное имя в консоль.

Ради любопытства, может ли кто-нибудь просветить меня, что здесь происходит? Для записи я использую Visual Studio 2012 Express.

Ответы на вопрос(2)

Ваш ответ на вопрос