Aufsplitterung von Strings



  • Ich habe ein Problem bei einer aufgabe die ich unbedingt lösen muss.
    Das hauptsächliche problem das ich habe ich das ich noch nie einen String aufgesplittert habe und auch nicht weiß wie das geht.
    Mir wurde eine aufgabe gestellt wo ich ein Taschenrechner programmieren muss, das wörter erkennt, bzw. Zahlen die als Wort geschrieben sind.
    Das Programm soll folgende Operatoren in Wort und als Zeichen unterstützen:
    " + " " - " " * " " / ", sowie alle Zahlen von -9.999.999 bis 9.999.999 in Wort und Zahl erkennen und richtig berechnen können.
    Ein beispiel:
    > dreihundertzweiundneunzig mal 7
    Ergebnis: 2744
    Kann mir da jemand helfen?



  • willst du std::strings benutzen oder char*?



  • Warscheinlich char
    aber wie gesagt habe ich das mit dem aufsplittern noch nicht gemacht.



  • Da würde ich aber std::string für nutzen. Ist meines Erachtens viel einfacher zu verwenden.

    In der Klasse std::string schau dir dann mal die Methoden find(), replace() etc. an. Am besten unter http://www.cppreference.com/cppstring/. Damit sollte dein Problem dann nicht allzu schwer lösbar sein.

    Caipi



  • dann musst du z.b. so machen, dass du in einer schleife die einzelnen elemente (array[0] bis array[100] in der art) durchläufst und dann prüfst, ob da n leerzeichen ist und das dann schritt für schritt in einen anderen array reinschreibst... sehr kompliziert. besser gehts eindeutig mit std::string.

    /EDIT: oh tschuldigung hab caipis post zu spät gesehen



  • Ich habe mit std::String noch nicht gearbeitet.
    Wie setzt man das am besten ein?



  • http://www.cppreference.com/cppstring/

    Es heißt übrigens "aufsplitten", denn es kommt vom englischen Wort "to split", was "zerteilen" bedeutet. Das hat mit Splitter also wenig zu tun.

    EDIT: Sorry, habe übersehen, dass der Link bereits gepostet wurde 😉 In der Tutorials-Section auf der Homepage wirst du sicher fündig bezüglich der Nutzung der string-klasse



  • Hi,

    der hinweis mit find wurde ja schon gegeben. Etwas einfacher geht es mit boost::string_algo. Da liefert find eine iterator-range. Das ist von vorteil fürs ersetzen. Man bekommt zwei iteratoren. Einen auf den anfang des gefundenen strings und einen auf das ende.

    So könnte man sich im string vorarbeiten. Du müsstest also zunächst mal die ganze eingabe in worte aufteilen. In jedem wort gucken ob es eine zahl oder ein string ist. Bei ner zahl wandelst du direkt um. Bei strings könntest du dir ja ne map anlegen die die zahlworte auf die zahlenwerte abbildet.

    Ein naiver algortihmus in pseudocode an pascal angelehnt könnte so aussehen

    function string_to_number(str)
    var
      string_to_numbermap nmap;
      string temp,out,zahl;
      char curchar;
    
    begin
    
      foreach curchar in str
         temp+=curchar
         if zahl=nmap.find(temp) then
           out+=zahl;
      end foreach
    
      return out;
    end
    
    function parse_input(input)
    var
       list_of_string output,tokens;
       string tok;
    begin
       tokens=tokenize_string(input)
       foreach tok in tokens
           if !is_number(tok) then
             ouput.push(string_to_number(tok));
          else
            output.push(tok);
       end foreach
    end
    



Anmelden zum Antworten