2017-02-05 2 views
1

Faire quelques exercices simples, j'ai maintenant un énorme doute sur iostream et les pointeurs.Passer le pointeur char à cin et cin.get()

Ce sont les 2 fichiers légèrement différentes que j'ai fait (ils ont tous deux de travail):

fichier 1 reçoit une entrée comme "Mon nom est # Marco" et imprime cout "Mynameis"

int main(){ 
using namespace std; 
char* ch=new char[256]; 
int count=0; 
cout <<"Enter chars, # to quit:\n"; 
cin >> ch; 
while(*ch!='#'){ 
    cout << ch; 
    ++count; 
    cin >> ch; 
} 
cout << endl << count << " characters read\n"; 
return 0; 
} 

Fichier 2 reçoit la même entrée que précédemment, mais cette fois imprime les espaces cout aussi:

int main(){ 
using namespace std; 
char* ch=new char[256]; 
int count=0; 
cout <<"Enter chars, # to quit:\n"; 
cin.get(*ch); 
while(*ch!='#'){ 
    cout << *ch; 
    ++count; 
    cin.get(*ch); 
} 
cout << endl << count << " characters read\n"; 
return 0; 
} 

ce que je ne comprends pas pourquoi dans le second fichier à la ligne 8, je dois écrire « cout < < * ch "au lieu de" cout < < ch "comme dans le premier. En fait, si je l'utilise « Cout < < ch » dans le fichier 2, tout ce que je reçois est un tas de symboles aléatoires (personnages pris de l'adresse du pointeur, je suppose)

Répondre

1

Dans le premier cas, vous lisez un C chaîne de style dans votre tableau. Cela signifie que cin lit une chaîne de caractères à la fois et stocke cette séquence de caractères dans ch suivi d'un caractère nul de fin \0. Lorsque vous exécutez cout << ch, cout tente d'imprimer la chaîne entière, en s'arrêtant quand il frappe le caractère null.

Dans le deuxième cas, vous lisez un seul caractère et de le stocker dans ch[0]. Lorsque vous exécutez cout << ch, cout pense que votre char* est une chaîne de style C, et il tente d'imprimer la chaîne entière, en s'arrêtant seulement quand il frappe un caractère nul. Les caractères après le premier seront probablement des valeurs de poubelle - quoi qu'il arrive en mémoire. C'est un comportement indéfini.

Notez que dans le code réel, vous devriez vérifier que vos lectures ont réussi. Si votre programme rencontre un EOF ou une entrée invalide, votre boucle fonctionnera pour toujours. En outre cin >> ch a un potentiel pour un dépassement de tampon si l'utilisateur entre trop de caractères. Mieux vaut utiliser un std::string ou la version de cin.get qui prend un argument de taille de flux.