web-dev-qa-db-fra.com

Différence entre cin et cin.get () pour le tableau char

J'ai ces 2 codes:

char a[256];
cin>>a;
cout<<a;

et

char a[256];
cin.get(a,256);cin.get();
cout<<a;

et peut-être, par rapport au second sans cin.get ();

char a[256];
cin.get(a,256);
cout<<a;

Ma question est (la première): pour un tableau de caractères, que dois-je utiliser? cin ou cin.get ()? Et pourquoi devrais-je utiliser cin.get (); sans paramètre après l'initialisation de mon caractère?

Et ma deuxième question est: mon professeur de c ++ m'a appris à utiliser à chaque fois cin.get () pour les caractères d'initialisation et APRÈS chaque tableau de caractères d'initialisation ou tableau int ou juste int ou autre, pour mettre à nouveau cin.get (); après ça. C'est ce que je voulais demander au départ.

Donc, maintenant j'ai ces 2: Dans ce cas, sans cin.get () après l'initialisation entière, mon programme va se casser et je ne peux plus faire l'initialisation de mon caractère.

int n;
cin>>n;
char a[256];
cin.get(a,256); cin.get();  // with or without cin.get();?
cout<<a;

Et la bonne:

int n;
cin>>n; cin.get();
char a[256];
cin.get(a,256); cin.get(); // again, with or without?
cout<<a;

Alors, quel est le problème? Veuillez expliquer à chaque cas! Je vous remercie.

11
Ruben P

Ils font des choses différentes, alors choisissez celui qui fait ce que vous voulez, ou les meilleures alternatives données ci-dessous.

Le premier cin>>a; Lit un seul mot, sautant les premiers caractères d'espace et s'arrêtant lorsqu'il rencontre un caractère d'espace (qui inclut la fin de la ligne).

La deuxième cin.get(a,256);cin.get(); lit une ligne entière, puis consomme le caractère de fin de ligne pour que la répétition lise la ligne suivante. cin.getline(a,256) est une façon un peu plus nette de le faire.

La troisième cin.get(a,256) lit une ligne entière mais laisse le caractère de fin de ligne dans le flux, de sorte que la répétition ne donnera plus d'entrée.

Dans chaque cas, vous obtiendrez une sorte de mauvais comportement si le mot/ligne d'entrée est plus long que le tampon de taille fixe. Pour cette raison, vous devez généralement utiliser un type de chaîne plus convivial:

std::string a;
std::cin >> a;              // single Word
std::getline(std::cin, a);  // whole line

La chaîne augmentera pour s'adapter à n'importe quelle quantité d'entrée.

10
Mike Seymour

Le problème réside probablement dans la façon dont vous entrez les valeurs ultérieurement. La cin.get() après chaque initialisation est là pour "saisir" le caractère de nouvelle ligne qui est mis dans le flux chaque fois que vous appuyez sur Entrée. Disons que vous commencez à saisir vos valeurs comme ceci:

2 

a b c d...

En supposant que vous avez appuyé sur Entrée après 2, le caractère de nouvelle ligne a également été mis sur le flux. Lorsque vous appelez cin.get() après cela, il saisira et supprimera le caractère de nouvelle ligne, permettant au reste de votre code d'obtenir correctement l'entrée.

Pour répondre à votre première question, pour un tableau, vous devez utiliser cin.get À la place de l'opérateur surchargé >> cin>> Car cela ne saisirait qu'un seul mot et cela ne limiterait pas la quantité de caractères saisis, ce qui pourrait entraîner un débordement et des corruptions de données/plantage du programme.

D'autre part, cin.get() vous permet de spécifier le nombre maximum de caractères lus, évitant de tels bugs.

3
Nazara

Pour un tableau de caractères, utilisez cin.get () car il compte les espaces blancs alors que cin ne définit pas et surtout le nombre maximum de caractères à lire par exemple.

 char foo[25]; //set maximum number of characters 
 cout << "Please type in characters for foo << endl;
 cin.get(foo,25);
 cout << ' ' << foo;

Dans ce cas, vous ne pouvez saisir que 24 caractères et un caractère de terminaison nul '/ 0'. J'espère que cela répond à votre première question. J'utiliserais personnellement une chaîne.

2
Michael Davis