2017-03-27 2 views
0

Je suis nouveau en C++ et j'essaie de résoudre l'exercice 6 du chapitre 4 du livre de Bjarne Stroustrups "Principes de programmation et de la pratique en utilisant C++ et ne comprennent pas pourquoi mon code ne fonctionne pasC++ si (cin >> entrée) ne fonctionne pas correctement dans la boucle while

L'exercice:.

Faire un vecteur contenant les « une » dix valeurs de chaîne « zéro », ..., « neuf » Utilisez cela dans un programme qui convertit un chiffre en valeur correspondante: par exemple, l'entrée 7 donne la sortie sept. Avoir le même programme, en utilisant la même boucle d'entrée, rt numéros épelés dans leur forme de chiffres; par exemple, l'entrée donne sept la sortie 7.

Ma boucle exécute une seule fois pour une chaîne et une fois pour un int, la boucle semble se poursuivre, mais il n'a pas d'importance que je donne entrée , il ne fait pas ce qu'il est censé faire.

Une fois, cela a fonctionné pour plusieurs entrées int, mais seulement une fois toutes les deux secondes. C'est vraiment bizarre et je ne sais pas comment résoudre ça différemment.

Ce serait génial si quelqu'un pouvait m'aider. (Je ne suis pas non plus un locuteur natif, donc désolé, s'il y a des erreurs)

La bibliothèque dans ce code est une bibliothèque fournie avec le livre, pour faciliter le début pour nous noobies je suppose.

#include "std_lib_facilities.h" 

int main() 
{ 
    vector<string>s = {"zero","one","two","three","four","five","six","seven","eight","nine"}; 

    string input_string; 
    int input_int; 

    while(true) 
    { 
     if(cin>>input_string) 
     { 
      for(int i = 0; i<s.size(); i++) 
      { 
        if(input_string == s[i]) 
        { 
         cout<<input_string<<" = "<<i<<"\n"; 
        } 
      } 
     } 

     if(cin>>input_int) 
     { 
      cout<<input_int<<" = "<<s[input_int]<<"\n"; 
     } 

    } 

    return 0; 
} 
+3

'il ne fait pas ce qu'il est censé do' n'est pas une description du problème utile. "Bonjour, la réparation automobile de Chuck, ma voiture ne fait pas ce qu'elle est censée faire". –

+0

Jamais, ne jamais sérieusement utiliser 'while (true)' comme ça. Commencez à utiliser 'while (variable) {}' à la place. Est-ce une trop mauvaise habitude qui est préférable de ne pas commencer à utiliser. Commencez à partir de là, vous comprendrez le reste. – gvlachakis

+0

@SamVarshavchik Désolé, je n'avais vraiment aucune idée de comment formuler cette question. – Neyeli

Répondre

1

Lorsque vous (avec succès) lire des données depuis std::cin, l'entrée est extrait à partir du tampon. L'entrée dans le tampon est supprimée et ne peut pas être relue.

Et quand vous lisez d'abord sous la forme d'une chaîne, cela va lire toute entrée entière possible en tant que chaîne.

Il y a deux façons de résoudre ce:

  1. Tentative de lecture comme intpremier. Et si cela échoue clear les erreurs et lire comme une chaîne.

  2. Lecture en tant que chaîne et essai à convert à int. Si la conversion échoue, vous avez une chaîne.

+0

J'ai essayé les deux et malheureusement je ne peux pas le faire fonctionner. Lorsque la conversion échoue, elle ne rentre pas dans la branche else, elle termine juste mon programme: /. "Aborted (core dumped)" Je l'ai essayé avec stoi(), avez-vous de meilleures suggestions? – Neyeli

+0

@Neyeli Si vous lisez la référence 'std :: stoi' liée, vous remarquerez qu'elle pourrait lancer des exceptions. Si vous n'êtes pas à l'aise avec les exceptions, vous pouvez utiliser ['std :: strtol'] (http://en.cppreference.com/w/cpp/string/byte/strtol) à la place. –

0

if(cin >> input) ne fonctionne pas correctement dans la boucle while?

Une implémentation possible de l'entrée de votre programme ressemblerait à quelque chose comme:

std::string sentinel = "|"; 
std::string input; 

// read whole line, then check if exit command 
while (getline(std::cin, input) && input != sentinel) 
{ 
    // use string stream to check whether input digit or string 
    std::stringstream ss(input); 

    // if string, convert to digit 

    // else if digit, convert to string 

    // else clause containing a check for invalid input 
} 

Discriminer entre int et string valeur que vous pouvez utiliser peek(), par exemple. De préférence, les deux dernières actions de conversion (entre int et string) sont effectuées par des fonctions séparées.

En supposant l'inclusion des en-têtes:

#include <iostream> 
#include <sstream>