2017-02-01 2 views
0

hier ist meine Lösung für ein einfaches Problem meines Lehrbuches. Innerhalb davon versuche ich, den Eingabestrom zu verwenden, um zuerst die nicht numerische Eingabe zu erkennen, und dann zu prüfen, ob es mit dem '|' Zeichen, das Programm zu beenden:Verwendung von Eingangsstrom nach etwas falsch wurde in C++ eingegeben

int main() 
{ 
    double n1, n2; 
    char Finisher; 
    while (true) { 
     std::cout << "Enter number 1:\n"; 
     if (std::cin >> n1) {} 
     else { 
      std::cin >> Finisher; 
      if (Finisher == '|') break; //Condition that must lead to program termination. 
      std::cin.clear(); 
      std::cin.ignore(40000,'\n'); //40000: only a big number 
     } 
     std::cout << "Enter number 2:\n"; 
     if (std::cin >> n2) {} 
     else { 
      std::cin >> Finisher; 
      if (Finisher == '|') break; 
      std::cin.clear(); 
      std::cin.ignore(40000, '\n'); 
     } 

     if (n1 < n2) { 
      std::cout << "The smaller value is: " << n1 << " \nThe larger value is: " << n2 << '\n'; 
      if ((n1 - n2) < 1.0/100 && (n1 - n2) > -1.0/100) { 
       std::cout << "The values are almost equal\n"; 
      } 
     } 
     else if(n1>n2){ 
      std::cout << "The smaller value is: " << n2 << " \nThe larger value is: " << n1 << '\n'; 
      if ((n1 - n2) < 1.0/100 && (n1 - n2) > -1.0/100) { 
       std::cout << "The values are almost equal\n"; 
      } 
     } 
     else { std::cout << "both values are equal\n"; } 
    } 
    return 0; 
} 

Problem ist, dass mein „Finisher“ char-Variable als nutzlos scheint, und jede nicht-numerische Eingabe (Art) geht verloren! und ein anderes festes Zeichen wird eingegeben, unabhängig davon, was ich eingegeben habe, in meinem Fall ist es immer so: enter image description here Was ist los ?! Danke.

+0

Nur ein Nitpick. Vielleicht möchten Sie mehr tun * "DRY - Do not Repeat Yourself" *. – WhiZTiM

+0

Warum nicht einen String lesen (oder vielleicht [eine ganze Zeile] (http://en.cppreference.com/w/cpp/string/basic_string/getline)), überprüfen Sie, ob das erste Zeichen [ist eine Ziffer] (http: //en.cppreference.com/w/cpp/string/byte/isdigit) und versuchen Sie dann [die Zeichenfolge in eine ganze Zahl zu konvertieren] (http://en.cppreference.com/w/cpp/string/basic_string/stol). Wenn keine Ziffer vorhanden ist, dann prüfe nach '' | '', und falls nicht gefunden, verwerfe einfach die Eingabe. –

+0

@Yuriy lvaskevych Löschen, um den fehlgeschlagenen Status von std :: cin zu ändern, damit wieder neue eingegebene Eingaben akzeptiert werden können, und ich verwende die Ignorierung, um alle vorherigen Eingaben zu entfernen. (ihre Namen (Clear & Ignore) sind ein bisschen anders als das, was sie tun) –

Antwort

1

die clear() nach oben bewegen scheint zu funktionieren:

if (std::cin >> n1) {} 
    else { 
     std::cin.clear(); 
     std::cin >> Finisher; 
     if (Finisher == '|') break; //Condition that must lead to program termination. 
     std::cin.ignore(40000,'\n'); //40000: only a big number 
    } 
0

Das Problem ist, dass, sobald die Lese ausfällt, cin in einem Zustand befindet, in dem es nicht in der Lage sein wird, irgendetwas anderes, bis Sie clear es zu lesen . Sie müssen cin.clear(); anrufen, bevor Sie die Finisher einlesen.

Natürlich, dass Sie noch in der Lage versetzt, wo Sie für die Finisher in einem separaten Zeichen zu lesen. Es wäre eleganter, ein einzelnes Token einzulesen und dann zu prüfen, ob es sich um eine Zahl oder ein Pipe-Zeichen handelt.

#include <cstdlib> 
#include <iostream> 
#include <sstream> 
#include <stdexcept> 
#include <string> 

typedef double number; 

number parse_number() { 

    static std::string in; 
    static std::istringstream stream; 
    number ret; 

    std::cin >> in; 
    stream.clear(); 
    stream.str(in); 

    if (stream >> ret) 
     return ret; 

    if (in.front() == '|') 
     std::exit(0); 

    std::ostringstream error; 
    error << "Could not parse token, \"" << in << ".\""; 
    throw std::runtime_error(error); 

} 

int main() { 

    while (true) { 

     const number n1 = parse_number(); 
     const number n2 = parse_number(); 

     // Do stuff with the numbers. 

    } 

} 
Verwandte Themen