C++ falsche Abzweigung bei if/else
-
Hallo Leute,
schreibe gerade an einem größerem Projekt(Konsolenanwendung) in Visual C++ 2010 (64 bit Betriebssystem). Jedoch hakt es gewaltig an einem if/else Block im Code(Abfrage beim Anwender per String: Wenn Benutzer Ja eingegeben hat, tuh dies, wenn nicht tuh das. Das Problem trat erst vorhin auf. Davor funktioniert alles einwandfrei. Das Programm ignoriert jedoch nun jegliche Eingabe und bleibt behaarlich im if- zweig. Habe dann ein Debugprojekt erstellt und das Projekt auf folgenden Code zum Test geschrumpft:#include <iostream> #include <windows.h> #include <string> using namespace std; string input; int main () { cout << "Ja oder nein" << endl; cin >> input; if(input == "ja" || "Ja" || "JA") { cout << "JA" << endl; system("PAUSE"); return 0; }else{ cout << "NEIN" << endl; system("PAUSE"); return 0; } return 0; }
-
if(input == "ja" || "Ja" || "JA")
if(input == "ja" || input == "Ja" || input == "JA")Edit:
BTW: Du könntest auch zuerst den eingelesenen string mit std::tolower(..) klein machen und danach nur noch ein Vergleich durchführen.
-
theta schrieb:
if(input == "ja" || "Ja" || "JA")
if(input == "ja" || input == "Ja" || input == "JA")Ich liefer mal das "warum" nach:
"Ja" und "JA" sind char* - Literale. Die ||-Operatoren erwarten boolsche Werte. Pointer (also auch char*) können implizit in bool konvertiert werden, wobei alles was nicht NULL ist true ergibt. Deine Abfrage ist also "if (input == "ja" || true || true) -> also immer true.
-
Alles klar, vielen Dank, jetzt klappt's. Und danke für den Tipp von theta.
-
if(input == "ja" || input == "Ja" || input == "JA") { cout << "JA" << endl; system("PAUSE"); return 0; } else { cout << "NEIN" << endl; system("PAUSE"); return 0; } return 0;schickerer Code:
transform(input, input+2, input, toupper); std::cout << input == "JA" ? "JA" : "NEIN"; system("PAUSE"); return 0;BTW:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html schrieb:
Achtung: Der Aufruf von system("pause") ist kein adäquater Ersatz! Warum system() grundsätzlich gemieden werden sollte (nicht nur weil es verdammt langsam ist), findet ihr in diesem FAQ-Beitrag: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39453.html
-
Weil ich es grad sehe: Vielleicht solltest Du Dir auch klar darüber werden, wann man lokale und wann globale Variablen verwendet. In diesem Spielzeug-Code hier ist es zwar ziemlich egal für die Funktion des Programms, aber es würde sich schon vom Stil her anbieten 'input' lokal zu halten. Das 'system("PAUSE");' ist auch nicht so schön und kann mit den standardisierten Stream-Operationen nachgebildet werden. Wie gesagt, hier ist es nicht so wahnsinnig schlimm, aber für die Zukunft kann man sich das mal merken, bevor man sich Murks angewöhnt
. Am besten wäre natürlich noch das kompilierte Programm in einer Konsole so zu starten, dass man nicht erst überflüssigerweise pausieren muss um das Ergebnis zu sehen. Beim Visual Studio und anderen IDEs gibt es da IIRC eine Option und zur Not kann man es selber direkt aus einer offenen Konsole starten.
-
Das mit der globalen Variable liegt daran, dass ich in dem eigentlichen Programm mehrere Funktionen habe, die auf die Variable Input zugreifen müssen. system("PAUSE"); habe ich deshalb verwendet, weil ich andere Möglichkeiten noch nicht kannte. Lasse mich aber gern belehren.
-
videotuner schrieb:
Lasse mich aber gern belehren.
Dann kannste dir ja mal dies hier durchlesen

http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html
-
videotuner schrieb:
Das mit der globalen Variable liegt daran, dass ich in dem eigentlichen Programm mehrere Funktionen habe, die auf die Variable Input zugreifen müssen.
Umso schlimmer. Da gibt es viel bessere, viel weniger fehleranfällige Methoden für.
-
videotuner schrieb:
if(input == "ja" || "Ja" || "JA")Jaah, manchmal wünsche ich mir echt sowas machen zu können. Fein und klein halt

-
Ein
if(collection("Ja", "ja", "JA").contains(input))liegt durchaus im Bereich des Machbaren.
-
Michael E. schrieb:
Ein
if(collection("Ja", "ja", "JA").contains(input))liegt durchaus im Bereich des Machbaren.
Leider viel zu umständlich. Natürlich kann ich mir viel Funktionalität selber nachbilden, aber solche "menschlich gesehenen" einfachen Konstrukte sollten lieber build-In sein.
Sowas wäre echt viel schöner:
if(0 < zahl < 15) if(zahl == 5 || 3) if(str != "Y" || "N")Statt:
if(variable(zahl).isBetween(0,5)) if(variable(zahl).contains(3,5)) if(variable(zahl).contains(3,5,6,23)) if(variable(str).containsNot("Y","N")) if(variable(str).containsNot("Y","N","y","n"))Naja, auch geschmacksache
Wobei, wenn ich die variable().func() Konstrukte sehe, mir das leserlich mehr gefällt, als die kryptischen Zeichen oben.
-
KasF schrieb:
Sowas wäre echt viel schöner:
if(zahl == 5 || 3)Aber geht halt nicht, weil
bool b,c,d; ... if(b == c || d)Dagegen könnte man aber ein neues Sprachmittel einführen:
if(b == c || b==d || b==e)bekommt die abkürzende Schreibweise
if( (b ==) c || d || e)Natürlich auch alle anderen Operatoren zulassen. Wie schön das wird!
Statt dem häßlichenif( (pow(a,2) + pow(b,2) <= pow(c,2) )Kann man jetzt gleichen Code zusammenziehen, der irgendwie mit allen im Bedinungsausdruck beteiligten Variablen zu tun hat.
if( ( pow( ) a+b==c ( ,2) ) )Natürlich auch mit der sqrt-Variante des Satzes des Pythagoras.
if( sqrt( ( pow( ) a+b ( ,2) ) )<=c )
-
KasF schrieb:
Statt:
[..] if(variable(zahl).isBetween(0,5)) [..] if(variable(str).containsNot("Y","N","y","n")) [..]Du kannst ja auch
if(inRange(0, zahl, 5))
und
if(str == multiCompare("Y","N","y","n"))
machen.wobei multiCompare halt kein schöner name ist...
das inRange verwende ich zB sehr oft.