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
-
noch etwas zum lesen
http://cplus.kompf.de/artikel/strings.html