Pourquoi ce travail? À l'aide de cin pour lire un tableau de char plus petit que donnée d'entrée

Je suis en train de lire C++ Primer Plus (6e Édition) et je suis venu à travers des exemples de code dans le chapitre 4 que j'ai une question à propos de:

Listing 4.2 strings.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] = '
//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;
}
'
; //set to null character cout << "Here are the first 3 characters of my name: "; cout << name2 << endl; return 0; }

Le code lui-même ne cause pas de confusion, mais j'ai été en cours d'exécution à travers et je suis confus par un certain scénario.

nom1 est initialisé comme un tableau de caractères à 15 éléments en longueur - suis-je en droit de penser cela devrait contenir une chaîne de 14 caractères? La fin char devrait être réservé pour le terminateur de chaîne, non?

Si j'entre mon nom en tant que HowCanIPossiblyFitThisEntireStringin?, J'obtiens le résultat suivant:

Howdy! Je suis en C++owboy! Quel est votre nom?

HowCanIPossiblyFitThisEntireStringin?

Bien, HowCanIPossiblyFitThisEntireStringin?, votre nom a 37 lettres et est stocké

dans un tableau de 15 octets.

Votre initiale est H.

Voici les 3 premiers caractères de mon nom: C++

Comment est le nom entier je entrer stockées? Si j'ai pas le code, après cin lit dans nom1, Visual Studio me dit qu'il contient des éléments de 0 à 14 ans, avec la dernière en date étant le char de " y " ("HowCanIPossibly...). Je suppose que de ce que toutes les données saisies a été tronqué et perdu, mais ce n'est évidemment pas le cas comme le suivant cout avec succès, écrit l'intégralité du nom de la console.

Pour la curiosité en soi, quelqu'un pourrait-il m'éclairer à ce qui se passe ici? Pour mémoire, je suis à l'aide de Visual Studio 2012 Express.

OriginalL'auteur Rich | 2013-03-26