0
votes

Arrêtez de prendre l'entrée quand une ligne vierge rencontre

J'essaie d'arrêter la boucle lorsque l'utilisateur donne une ligne vide, sinon Poussez le nom et marquez une paire de vecteur. Mais ce code ne fonctionne pas.

Format d'entrée: strong> p>

p> blockQuote>

E.g.: P>

akash 45 p> blockQuote>

Mon code est ci-dessous: P>

 int m;
cin>>m;
vector<pair<string,int>>player;
string name;
int score;
while(1)
{      


    cin>>name;
    if(name.empty())
    break;
    cin>>score;
    player.push_back(make_pair(name,score));
}


1 commentaires

Voulez-vous dire nouvelle ligne par une ligne blanche ?


3 Réponses :


1
votes
std::cin.seekg(0, std::ios::end);
std::cin.clear();

2 commentaires

Bonjour, j'ai déjà essayé cette méthode. Cela ne fonctionne pas. Pouvez-vous s'il vous plaît me donner une autre méthode?


Oui Désolé, je n'ai pas vu ça ne fonctionne que dans la première boucle. Je vous ai trouvé une autre méthode.



0
votes

Il y a un petit programme pour vous démontrer comment l'atteindre:

while (true)
    if (name.empty())
        break;
    else {
        std::getline(std::cin, name); // recalling statement X again
        nameList.push_back(name);
    }


2 commentaires

Bonjour, j'ai essayé cette méthode, mais la boucle s'est arrêtée avant de donner la deuxième entrée de la deuxième fois. Voici mon code: STD :: getline (std :: Cin, nom); CIN >> Score; joueur.push_back (make_pair (nom, score)); pour (;;) {if (nom.empty ()) cassé; else {std :: getline (std :: Cin, nom); CIN >> Score; joueur.push_back (make_pair (nom, score)); }}


Un problème, vous essayez déjà d'accepter toute la ligne pour juste nom (qui accepte également les suites de gros), comment vous attendez-vous à accepter score dans la même ligne?



2
votes

opérateur >> ignore les espaces blancs et les pauses de ligne sont traitées comme des espaces blanche, donc CIN >> nom ne retournera jamais une chaîne vierge (barrage d'une défaillance d'entrée). < P> Pour accomplir ce que vous essayez, vous devez utiliser get :: getline () au lieu de lire une ligne entière à la fois. Vous pouvez ensuite tester des lignes vierges et peut utiliser std :: istringstream pour analyser les valeurs de chaque ligne non vide, par exemple: xxx


4 commentaires

Bonjour, ce code fonctionne bien. Merci pour ça. Mais il y a un autre problème, chaque fois que j'essaie de prendre une autre entrée avant cette paire de vecteur, le programme ne prend pas d'entrée pour cette paire. Supposons que je veux prendre une entrée m (un int) puis cette paire. 5 ABC 545 CD 45 Comme ça


@ Deba98 Il est difficile de voir la mise en forme réelle de l'entrée dans un commentaire. Veuillez éditer votre question avec plus de détails et de formatage.


J'ai édité la question. Veuillez vérifier, j'ai ajouté une autre entrée m, avant de saisir le nom. Lorsque j'exécute votre solution, après avoir pris l'entrée de M, le programme est terminé. Mais si je désactive la ligne, prenez l'apport de M, le programme fonctionne bien


@ Deba98 Vous avez édité votre question à inclure M dans le contexte de votre ancien code, pas dans le contexte du code que je vous ai donné. En outre, vous n'avez pas montré le format de l'entrée mise à jour. La valeur de m est-elle sur sa propre ligne ou est-ce sur la même ligne que la 1ère paire? Cela fait une grande différence, comme dans ce dernier cas, vous devez surveillez ce problème .