Apostroph Abkürzungen ausschreiben
-
Schreibe ein Programm das alle mit Apostroph abgekürzten Schreibweisen von "es" ausschreibt. Bindestriche in den Wörtern erhält und alle Zeichen in Kleinbuchstaben umwandelt. (Aus "-die as-if-Regel gibt's nicht." soll das werden: "die as-if-regel gibt es nicht")
void tolower(string& s) { for (int i = 0;i<s.length();++i) s[i] = tolower(s[i]); } int main() { ifstream istr("Name.txt"); if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl; string line; getline(istr,line); for (int i = 0; i<line.size();++i) switch(line[i]){ case'.':line[i] = ' '; case'\'s':line[i] = 'es'; // Fehler es wird das Ausgegebn: gibt's und nichtss } stringstream ss(line); vector<string> vs; string word; while(ss>>word) vs.push_back(word); for (int i = 0;i<vs.size();++i){ tolower(vs[i]); cout << vs[i] << "\n";} keep_window_open(); return 0; }
-
Du solltest wohl eher
replace
und
find
nutzen.Generell würde ich dir empfehlen, dir die Funktionen von std::string anzuschauen wenn du string Verarbeitung machst.
-
Hallo winux,
dein Compiler müßte eigentlich einen Fehler (bzw. zumindestens eine Warnung) anzeigen, denn
'\'s'
ist kein char-Literal (da es aus zwei Zeichen besteht)!
-
Habe auch eine Warnung bekommen.
-
Th69 schrieb:
Hallo winux,
dein Compiler müßte eigentlich einen Fehler (bzw. zumindestens eine Warnung) anzeigen, denn
'\'s'
ist kein char-Literal (da es aus zwei Zeichen besteht)!
Was gibt denn
cout<<sizeof('\'s')<<'\n';
cout<<int('\'s')<<'\n';
aus?
-
Also 's wird auch Ausgeben. Doch es muss gibt es Ausgeben werden.
-
Ich hab dir nicht umsonst geschrieben dass du das Ganze mit find und replace machen solltest.
Hier ein Beispiel:
int main() { std::string toTest = "Hallo gibt's was neues!"; std::size_t pos = toTest.find("'s", 0); toTest.replace(pos, 2, " es"); std::cout << toTest << std::endl; }
Ohne Fehlerbehandlung etc.
Die Parameter stehen auf den von mir verlinkten Seiten.
-
Du kannst auf deine Art
line[i]
nicht einfach so einen neuen String zuweisen (was du auch gar nicht machst. 'es' sollte eigentlich auch nicht kompilieren oder zumindest 'ne kräftige Warnung ausspucken. Wenn, dann müsste es schon "es" heißen).
Dennline[i]
ist vom Typchar
und kann daher auch nur einenchar
aufnehmen. Du willst aber einen ganzen String zuweisen. Das klappt nicht.Dein Ansatz mit
switch
kann so auch nicht funktionieren, da du an einer Stelle prüfen willst, ob ein String zwei bestimmte aufeinander folgende Zeichen besitzt ('\'' und 's'). Das sind aber eben zwei Zeichen,switch
kann aber nur auf ein Zeichen prüfen.Wenn du das mit C++
string
s lösen willst, solltest du den Beitrag von Tobias Gerg beherzigen. Da du aber offenbar den Unterschied zwischen Zeichen und Strings noch nicht (voll)ständig verstanden hast, solltest du dir das ggf. nochmal etwas näher anschauen. Evtl. auf niedrigster Ebene, d.h. mit verpöhnten C-Strings. Dann wirst du auch verstehen, dass du deinen String "halbieren" musst und anschließend dein "es" einfügen kannst.
-
Dank eurer Hilfe habe die Aufgabe gelöst.
void tolower(string& s) { for (int i = 0;i<s.length();++i) s[i] = tolower(s[i]); } int main() { ifstream istr("Name.txt"); if(!istr) cout << "Fehler beim Oeffnen der Eingabedatei" << endl; size_t found; string line; getline(istr,line); for (int i = 0; i<line.size();++i) switch(line[i]){ case'.':line[i] = ' '; size_t pos = line.find("'s", 0); line.replace(pos, 2, " es"); size_t pos2 = line.find("-die", 0); line.replace(pos2, 1, " "); } stringstream ss(line); vector<string> vs; string word; while(ss>>word) vs.push_back(word); for (int i = 0;i<vs.size();++i){ tolower(vs[i]); cout << vs[i] << "\n";} keep_window_open(); return 0; }
Die Ausgabe ist genau das was es sein sollte:
die as-if-regel gibt es nicht