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).
    Denn line[i] ist vom Typ char und kann daher auch nur einen char 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
    

Anmelden zum Antworten