2016-11-23 2 views
1

J'ai actuellement cette fonction:sautille ligne de boucle

double GrabNumber() { 
    double x; 
    cin >> x; 
    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

Son but est de vérifier si x est un numéro valide, le retour si elle est valide ou répéter cin >> x si elle est pas.

Il est appelé au cours de cette fonction:

void addition() { 
    cout << "\nEnter the first number: "; 
    double a = GrabNumber(); 
    cout << "Enter the second number: "; 
    double b = GrabNumber(); 
// rest of code 

Lorsque je tape par exemple « 6+ » quand il me dit d'entrer dans le premier numéro, il l'accepte, mais immédiatement va à la deuxième ligne et appelle une erreur où je n'ai même pas entré mon entrée. Je suppose que c'est parce que la première entrée accepte seulement "6" tandis que "+" va à la deuxième entrée retournant une erreur. Par conséquent, il doit y avoir un problème avec les paramètres de while.

+1

Je pense que vous devrez utiliser ['getline'] (http: // www .cplusplus.com/reference/string/string/getline /) et analyser la ligne complète, au lieu d'utiliser 'cin' comme ça – Garf365

+0

Mais Getline se lit comme une chaîne –

Répondre

4

Si votre saisie est immédiatement réussie, vous n'ignorez pas le reste de la ligne, qui se termine dans l'entrée suivante. Cela peut être corrigé en dupliquant simplement l'appel cin.ignore.

double GrabNumber() { 
    double x; 
    cin >> x; 

    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- 

    while (cin.fail()) { 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "You can only type numbers!\nEnter the number: "; 
     cin >> x; 
    } 
    return x; 
} 

Je vais laisser SECHAGE ce code comme un exercice;)

2

Pour éviter ce genre de problème, préfèrent utiliser getline et stod:

double GrabNumber() { 
    double x; 
    bool ok = false; 
    do 
    { 
     std::string raw; 
     std::getline (std::cin, raw); 
     try 
     { 
      x = stod(raw); 
      ok = true; 
     } 
     catch(...) 
     {} 
    } while(!ok); 
    return x; 
} 

En cas général, il est plus facile de Acquérir la chaîne brute avec getline et l'analyser juste après. De cette façon, vous pouvez vérifier tout ce que vous voulez: nombre de caractères, position du signe, s'il n'y a que le caractère numérique, etc.