switch me off!



  • 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 🙂


  • Gesperrt

    @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.



  • @RBS2 @DirkB

    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.


  • Gesperrt

    @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 4 switch.
    wie wäre es mit 1 switch und 9 case?


  • Gesperrt

    @DirkB sagte in switch me off!:

    @Lou-Cyphr3 das werden dann 12 case bei 4 switch.
    wie wäre es mit 1 switch und 9 case?

    11,12,13,
    21,22,23
    31,32,33

    also 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.


  • Gesperrt

    @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?



  • @Lou-Cyphr3

    mit [...] -Wall -Wextra [...] kompiliere[n]


Anmelden zum Antworten