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: Was ist los ?! Danke.
Nur ein Nitpick. Vielleicht möchten Sie mehr tun * "DRY - Do not Repeat Yourself" *. – WhiZTiM
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. –
@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) –