Switch-Case



  • Hallo,
    ich bin neu in der c++ Welt.
    Habe daher auch eine einfache Frage.
    Kann man mit einer Switch-Case-Anweisung auch Strings auswerten bzw. Prüfen um bestimmte Fälle zu unterscheiden? Bei Intergerwerten kenne ich das ja, möchte aber nun Strings prüfen. um Fälle zu unterscheiden.



  • Hallo,
    Switch-Case mit Strings geht leider gar nicht. Musst Du wohl anders machen.



  • Danke für den Hinweis, nutze ich else-If-Abfragen.
    Sieht zwar nicht schön aus, aber anders gehts nicht.



  • Hi,

    alternativ kannst Du evtl. eine std::map anlegen. Ist elegant, aber bisweilen oversized oder unpraktisch (z.B. wenn die Aufgaben der einzelnen Zweige zu unterschiedlich oder untereinander abhängig sind).

    Gruß,

    Simon2.



  • Wenn du uns etwas mehr ueber das Problem erzaehlst, das du mit dem string-switch loesen willst, kann dir vielleicht auch jemand eie Alternative zeigen, die das umgehen.

    Wenn die Moeglichkeiten in der switch-anweisung viele sind (oder viele werden koennen), dann wird eine if-else kaskade schnell unuebersichtlich und grausam zu warten. Die oben angesprochene Loesung mit der map koennte etwa wie folgt aussehn:

    void processString(std::string const& str) {
      enum { Bla, Blubb, Bla2, Omfg };  //die integralen werte, in die die strings uebersetzt werden
      static std::map<std::string, int> smap; //einmalig angelegtes "woerterbuch"
      static struct S{ S(){  //der ctor des Objekts traegt die Werte ins "woerterbuch" ein
        smap["bla"] = Bla;
        smap["blubb"] = Blubb;
        smap["BLUBB"] = Blubb;
        smap["bla2"] = Bla2;
        smap["omfg"] = Omfg;
      }} s;
    
      switch(smap[str]) {
        case Bla: /*...*/
        case Blubb: /*..*/
        //...
      }
    }
    


  • Genau ... und manchmal geht's auch ohne anschließendes switch und man kann gleich den map-Wert weiterverwenden:

    static std::map<std::string, int> offsetMap; //einmalig angelegtes "woerterbuch"
      static struct S{ S(){  //der ctor des Objekts traegt die Werte ins "woerterbuch" ein
        offsetMap["bla"] = 1;
        offsetMap["blubb"] = 3;
        offsetMap["BLUBB"] = 17;
        offsetMap["bla2"] = -2;
        offsetMap["omfg"] = 3;
      }} s;
    
      int i = getVal() + offsetMap[str];
    // kleine Warnung: operator[]() arbeitet ein wenig unerwartet bei nicht vorhandenen Elementen !!
    

    Oder man füllt die Map mit Funktionszeigern oder .... oder ...

    Gruß,

    Simon2.



  • das ist selbst mir gerade sehr von nutzem...
    kurz und anschaulich beschrieben, ich danke mal.

    hab mal ne andere frage zum switch-case. wie baue ich dort eine "else"-ähnliche anweisung ein?

    habe zum beispiel:

    [code]switch(nummer){
    	case 1: problempointer = &problem1; 
                         break;
    	case 8: problempointer = &problem8;
    		     break;		
    	case 9: problempointer = &problem9;
    		     break;	
    		};	 
    [/code]
    

    und möchte nun so etwas sagen wie:
    "case else: cout << "\nKeine Problemlösung bekannt!"

    ist sicher recht einfach, find nur nichts dazu, seh wohl grad den wald vor lauter bäumen nicht.
    oder bediene google und die forensuchfunktion falsch 🙄



  • Wenn ich Dich richtig verstehe, suchst Du nach 'default' (wird ausgeführt, wenn keine andere Bedingung erfüllt wurde:

    switch ()
    {
      case : ;
      break;
      case : ;
      break;
      default: ;
    }
    


  • Ich möche nochmal darauf hinweisen, dass die Verwendung der map mitunter einen ganz enormen Performance-Vorteil mit sich bringen kann. Noch besser wäre aber die Verwendung einer Hashtabelle ( std::tr1::unordered_map ). In VB.NET und C#, wo 'switch'-Anweisungen mit Strings erlaubt sind, wandelt der Compiler lange 'switch'-Abfragen auf Strings intern automatisch in die Verwendung einer Hashtabelle um.



  • meißt reicht doch ein enum:

    enum Auswahl{
        OPTION1
        OPTION2
        FOO
        BAR
        FOOBAR
        BLA
    }
    
    //[...]
    
    Auswahl auswahl = BLA;
    
    //[...]
    
    switch(auswahl){
        case OPTION1:
            break;
        case OPTION2:
            break;
        case FOO:
            break;
        case BAR:
            break;
        case FOOBAR:
            break;
        case BLA:
            break;
    }
    
    //[...]
    

    dann sieht das im Editor wie TEXT aus, Eingabeabfragen funktionieren so nicht, da sind die anderen Lösungen besser, aber alles was c++ intern ist lässt sich so realisieren.



  • ... für die antwort und die weiteren hinweise zur map...
    wünsche nen angenehmen start in die woche!


Anmelden zum Antworten