Dlaczego to działa? Użycie cin do odczytu do tablicy char mniejszej niż podane wejście

Czytam C ++ Primer Plus (6 edycja) i natknąłem się na przykładowy kod w rozdziale 4, na który mam pytanie:

Listing 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;
}

Sam kod nie powoduje żadnych nieporozumień, ale przeprowadziłem go i jestem zdezorientowany przez pewien scenariusz.

nazwa1 jest inicjalizowana jako tablica znaków o długości 15 elementów - czy mam rację, myśląc, że powinna ona zawierać łańcuch o długości 14 znaków? Znak końcowy powinien być zarezerwowany dla terminatora ciągu, prawda?

Jeśli wprowadzę moje imię jakoHowCanIPossiblyFitThisEntireStringIn?, Otrzymuję następujące dane wyjściowe:

Cześć! Jestem C ++ owboy! Jak masz na imię?

HowCanIPossiblyFitThisEntireStringIn?

Cóż, HowCanIPossiblyFitThisEntireStringIn ?, Twoje imię ma 37 liter i jest przechowywane

w tablicy 15 bajtów.

Twoim początkiem jest H.

Oto pierwsze 3 znaki mojego imienia: C ++

Jak zapisywana jest cała nazwa, którą wprowadzam? Jeśli przejdę przez kod, po wczytaniu cin do name1, Visual Studio powie mi, że zawiera elementy 0-14, z których ostatnim jest znak „y” („HowCanIPossibly ...). wprowadzone dane zostały obcięte i utracone, ale oczywiście nie ma to miejsca, ponieważ następny cout pomyślnie zapisuje całą nazwę na konsoli.

Ze względu na ciekawość, czy ktoś mógłby mnie oświecić, co się tutaj dzieje? Dla rekordu używam Visual Studio 2012 Express.

questionAnswers(2)

yourAnswerToTheQuestion