4 votes

Effacer un retour chariot de la mémoire en C++.

J'ai le code suivant :

int main()
{
// Variables
char name;

// Take the users name as input
cout << "Please enter you name..." << endl;
cin >> name;

// Write "Hello, world!" and await user response
cout << "Hello, " << name << "!" << endl;
cout << "Please press [ENTER] to continue...";
cin.get();

return 0;

}

Après que l'utilisateur a appuyé sur la touche retour pour saisir son nom, ce retour chariot est reporté à la fin du code où il est immédiatement appliqué comme entrée à cin.get(), ce qui met fin prématurément au programme. Que puis-je placer sur la ligne qui suit immédiatement

cin >> name;

pour empêcher que cela se produise ? Je sais que c'est possible, car je l'ai déjà fait, mais je ne me souviens pas de ce que c'est ni où je peux le trouver. Merci beaucoup d'avance.

9voto

Loki Astari Points 116129

Vous voulez vraiment utiliser tout ce qui se trouve sur l'entrée jusqu'à la nouvelle ligne comme nom.
Actuellement, votre code ne lit que le premier mot.

#include <iostream>
#include <string>

int main()
{
    // Variables
    std::string name;

    // Take the users name as input
    // Read everything upto the newline as the name.
    std::cout << "Please enter you name..." << std::endl;
    std::getline(std::cin, name);

    // Write "Hello, world!" and await user response
    // Ignroe all input until we see a newline.
    std::cout << "Hello, " << name << "!\n";
    std::cout << "Please press [ENTER] to continue..." << std::flush;
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
}

4voto

Tim Hoolihan Points 6982

La réponse la plus simple :

int main()
{
// Variables
char name;

// Take the users name as input
cout << "Please enter you name..." << endl;
cin >> name;
cin.get(); // get return here

// Write "Hello, world!" and await user response
cout << "Hello, " << name << "!" << endl;
cout << "Please press [ENTER] to continue...";
cin.get();

return 0;
}

3voto

Vous pouvez demander à votre flux d'ignorer les N caractères suivants avec

cin.ignore(1000, '\n');

Cela entraînera cin pour sauter jusqu'à 1000 caractères ou jusqu'à ce qu'il trouve (et supprime) un saut de ligne ( '\n' ). D'autres limites ou caractères de fin peuvent être spécifiés comme vous le souhaitez.

1voto

tunetosuraj Points 358

cin ignore le retour chariot, la valeur avant '\n' est stocké dans la variable et '\n' reste dans le flux d'entrée. Lorsque cin.get() est appelée, elle prend la valeur déjà présente dans le flux d'entrée (qui est '\n' ) et il est donc ignoré.

Pour éviter cette situation, la réponse de Tim est parfaite !

cin >> name;
cin.get(); // get return here

Vous pouvez également faire

(cin >> name).get(); // get return as soon as cin is completed.

UPDATE : Comme l'a fait remarquer Loki Astari, quand on utilise cin>> au tableau name la lecture se fera jusqu'au premier caractère d'espace blanc. Dans 'Tim Hoolihan', il y a un espace entre les noms. Ainsi, le tableau de noms stockera {'T','i','m','\n'} comme valeur, '\n' marquant la fin de la chaîne. Il faut éviter d'utiliser les tableaux de caractères pour les chaînes de caractères, et utiliser plutôt la classe string de #include<string> fichier d'en-tête. Une chaîne de caractères peut contenir un caractère d'espace blanc entre les deux, alors qu'un tableau ne le peut pas.

#include<iostream>
#include<string>

int main()
{
  string name; // string is a class, name is the object
  cout << "Please enter you name..." << endl;
  (cin >> name).get(); 
  cout << "Hello, " << name << "!" << endl;
  // String using the "power" of an array
  cout << "First two characters of your name are " << name[0] << name[1] << endl;
  cout << "Please press [ENTER] to continue...";
  cin.get();
  return 0;
}

0voto

codaddict Points 154968

Tout d'abord, le nom est une chaîne de caractères et vous le lisez dans un fichier de type char .

char name;

devrait être

string name;

Ajoutez également #include<string>

Maintenant pour effacer la nouvelle ligne du tampon vous pouvez faire :

std::cin.ignore(1);

après avoir lu le name .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X