switch me off!
-
@Zhavok ja, enum/enum class geht auch.
Wenn man unbedingt strings switchen will:
constexpr std::uint32_t fnv32(std::string_view s) { std::uint32_t hash{2166136261u}; for (std::size_t i = 0; i < s.size(); ++i) { hash = 16777619u * (hash ^ s[i]); } return hash; } std::string s = "foo"; switch (fnv32(s)) { case fnv32("foo"): // ... break; case fnv32("bar"): // ... break; // .... }
-
Hahaha. Das ist das beste Beispiel Strings zu vergleichen um andere Entwickler zu ärgern, die das dann lesen müssen. Aber trotzdem interessant die Methode, den String einfach zu hashen
-
Warum? Ist doch sogar ganz gut lesbar.
-
Ja schon, aber ich denke in der Praxis werden die meisten andere Wege nutzen um Strings zu vergleichen. Über ein == oder .compare() liest man einfach schneller drüber. Aber wenn man unbedingt switch/case nutzen will, sicher ein guter Weg
-
@Zhavok sagte in switch me off!:
Ja schon, aber ich denke in der Praxis werden die meisten andere Wege nutzen um Strings zu vergleichen. Über ein ==
== bei Strings vergleicht ihre Adressen. Das geht schief wenn man mit Gleichheit gleichen Inhalt meint. Da muss schon ein strcmp() oder sowas her.
-
Danke für die Tipps und die netten Worte.
#include <iostream> using namespace std; int main() { unsigned short a,b; cout << "Erste Ziffer (1..3): "; cin >> a; cout << "Zweite Ziffer (1..3): "; cin >> b; switch (a) { case 1 : switch (b){ case 1 : cout << "Elf" << endl; break; case 2 : cout << "zwölf" << endl; break; case 3 : cout << "Dreizehn" << endl; break; default : cout << "falsche Eingabe." << endl; } } return 0; }
So sollte es zufrieden stimmen.
-
@Lou-Cyphr3 sagte in switch me off!:
So sollte es zufrieden stimmen.
Für den Fall a==1. Das ist schon mal ein Anfang.
-
@Lou-Cyphr3 das werden dann 12
case
bei 4switch
.
wie wäre es mit 1switch
und 9case
?
-
@DirkB sagte in switch me off!:
@Lou-Cyphr3 das werden dann 12
case
bei 4switch
.
wie wäre es mit 1switch
und 9case
?11,12,13,
21,22,23
31,32,33also 3 * 3 cases,
bei einem switch: 9+default = 10.
bei 4 switch: 9+4*default = 13.
-
@RBS2 sagte in switch me off!:
== bei Strings vergleicht ihre Adressen.
Quatsch, sofern hier gerade von std::strings die Rede ist.
-
@RBS2 sagte in switch me off!:
bei 4 switch: 9+4*default = 13.
Nö. 12 + 4*default = 16;
switch(a) hat 3 case und ein default.
Jeder case von a hat ein switch(b) mit ebenso 3 case und ein default.
-
@DirkB sagte in switch me off!:
@RBS2 sagte in switch me off!:
bei 4 switch: 9+4*default = 13.
Nö. 12 + 4*default = 16;
switch(a) hat 3 case und ein default.
Jeder case von a hat ein switch(b) mit ebenso 3 case und ein default.Hast recht.
switch (a) case 1: switch (b) case 1: case 2: case 3: default: case 2: switch (b) case 1: case 2: case 3: default: case 3: switch (b) case 1: case 2: case 3: default: default: // von switch(a)
-
Hallo,
ich hab jetzt ein default-Problem.
#include <iostream> using namespace std; int main() { unsigned short a,b; cout << "Erste Ziffer (1..3): "; cin >> a; cout << "Zweite Ziffer (1..3): "; cin >> b; switch (a) { case 1 : switch (b){ case 1 : cout << "Elf" << endl; break; case 2 : cout << "zwölf" << endl; break; case 3 : cout << "Dreizehn" << endl; break; default : "falsch 1 \n"; } case 2 : switch (b){ case 1 : cout << "Einundzwanzig" << endl; break; case 2 : cout << "Zweiundzwanzig" << endl; break; case 3 : cout << "Dreiundzwanzig" << endl; break; default : cout << " falsch 2 \n"; } case 3 : switch (b){ case 1 : cout << "Einunddreissig" << endl; break; case 2 : cout << "Zweiunddreissig" << endl; break; case 3 : cout << "Dreiunddreissig" << endl; break; default : cout<< " falsch 3 \n"; } default : cout << "a falsch \n"; } return 0; }
Aus welchem Grund gibt es mir immer zusätzlich eine Falsche Eingabe
für a zurück?
-
Dann hast du offensichtlich irgendwo ein break vergessen.
-
So ist es . Danke @spiri
Waren gleich 3
-
@Lou-Cyphr3 Du solltest deinem Compiler sagen, dass er dich davor warnt!
Wenn ich den Code aus deinem Post mit
g++ -Wall -Wextra missingbreak.cpp
kompiliere, bekomme ich:g++ missingbreak.cpp -Wall -Wextra missingbreak.cpp: In function ‘int main()’: missingbreak.cpp:25:38: warning: statement has no effect [-Wunused-value] default : "falsch 1 \n"; ^ missingbreak.cpp:43:33: warning: this statement may fall through [-Wimplicit-fallthrough=] default : cout << " falsch 2 \n"; ~~~~~^~~~~~~~~~~~~~~~~ missingbreak.cpp:46:8: note: here case 3 : ^~~~ missingbreak.cpp:59:32: warning: this statement may fall through [-Wimplicit-fallthrough=] default : cout<< " falsch 3 \n"; ~~~~^~~~~~~~~~~~~~~~~ missingbreak.cpp:62:11: note: here default : cout << "a falsch \n"; ^~~~~~~
Und clang sagt:
clang++-7 missingbreak.cpp -Weverything -std=c++17 missingbreak.cpp:25:25: warning: expression result unused [-Wunused-value] default : "falsch 1 \n"; ^~~~~~~~~~~~~ missingbreak.cpp:28:6: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] case 2 : ^ missingbreak.cpp:28:6: note: insert '[[fallthrough]];' to silence this warning case 2 : ^ [[fallthrough]]; missingbreak.cpp:28:6: note: insert 'break;' to avoid fall-through case 2 : ^ break; missingbreak.cpp:46:8: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] case 3 : ^ missingbreak.cpp:46:8: note: insert '[[fallthrough]];' to silence this warning case 3 : ^ [[fallthrough]]; missingbreak.cpp:46:8: note: insert 'break;' to avoid fall-through case 3 : ^ break; missingbreak.cpp:62:11: warning: unannotated fall-through between switch labels [-Wimplicit-fallthrough] default : cout << "a falsch \n"; ^ missingbreak.cpp:62:11: note: insert '[[fallthrough]];' to silence this warning default : cout << "a falsch \n"; ^ [[fallthrough]]; missingbreak.cpp:62:11: note: insert 'break;' to avoid fall-through default : cout << "a falsch \n"; ^ break; 4 warnings generated.
Du siehst noch eine andere Warnung in beiden Ausgaben (unused-value), das ist auch noch ein Fehler in deinem Code.
-
Dieser Beitrag wurde gelöscht!
-
@Jockelx sagte in switch me off!:
@RBS2 sagte in switch me off!:
== bei Strings vergleicht ihre Adressen.
Quatsch, sofern hier gerade von std::strings die Rede ist.
Wie ist es denn nun richtig?
-
@DirkB sagte in switch me off!:
@RBS2 ein
switch(a*10+b)
geht auch
-
@wob Stimmt. da hatte ich das cout vergessen.
Wie sage ich denn dem Compiler, dass er mich warnt?