c++ problem



  • Hi, ich habe schon wieder eine Frage in C++:
    Das Programm soll einen Text einlesen (dieser wird mit Strg+Z und danach Enter) beendet. Das Programm soll den Text erneut ausgeben
    Wenn bestimmte Wörter in diesem Text vorkommen
    (disliked vektor) sollen diese als XXX augegeben werden.
    Irgendwo ist angeblich ein Vektor zu überladen oder so

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	string temp;
    	vector<string>txt(0);
    	vector<string>disliked(10);
    
    	disliked[0] ="Hi";
    	disliked[1] ="Baum";
    	disliked[2] ="Buch";
    	disliked[3] ="Rechner";
    	disliked[4] ="Kamera";
    	disliked[5] ="Steven";
    	disliked[6] ="careful";
    	disliked[7] ="Hilfe";
    	disliked[8] ="Monster";
    	disliked[9] ="Kamel";
    
    	while ( cin>> temp)
    	{txt.push_back(temp);}
    
    	for(int i = 0; i< txt.size();++i)
    	{  
    		for(int loop = 0;loop<disliked.size();++loop)
    		{
    			if(txt[i] == disliked[loop])
    			{cout <<" XXX " ;}
    			else if(txt[i] != disliked[loop])
    				{cout << txt[i] << " ";
    			     ++i;}}
    
    	}
    
    	cin.get();
    	return 0;
    }
    


  • Gringham schrieb:

    Irgendwo ist angeblich ein Vektor zu überladen oder so

    Ich vermute eher, da versteht jemand nicht so ganz, was er macht ^^ Was geht denn nicht?



  • Das ganze ist eine Aufgabe in einem Buch, in welchem ich gerade c++ zu lernen versuche, da ist es sehr gut möglich , dass ich vieles noch nicht verstehe.
    Man sieht den eingegeben Text kurz Aufblitzten ( ohne XXX, oder mit allerhöchstens einem) dann kommt eine Felermeldung : vector subscript out of range..., nur weiss ich nicht wo die vector Beschreibung oder so falsch sein sollte, oder wie ich sie verbessern kann.
    Danke aber schonmal, dass überhaupt jemand geantwortet hat.



  • Du machst in dem else Zweig ++i, das darfst du auf jeden Fall nicht tun. Aber obs das einzige Problem ist, weiß ich nicht.
    Du vergleichst auch die Zeilen, ob sie genau den verbotenen Wörtern entsprechen. Du willst ja wahrscheinlich eher herausfinden, ob ein verbotenes Wort in der Zeile vorkommt. Könntest du z.B. so probieren:

    if (txt[i].find(disliked[loop] != std::string::npos)
    cout << ...



  • Gringham schrieb:

    if(txt[i] == disliked[loop])
    			{cout <<" XXX " ;}
    			else if(txt[i] != disliked[loop])
    				{cout << txt[i] << " ";
    			     ++i;}}
    

    Du hast einen bösen Fehler gemacht. Verändere nie eine Laufvariable außerhalb des Schleifenkopfs. Dein i wird zu, sodass txt[i] out of range ist.


  • Mod

    Gringham schrieb:

    Man sieht den eingegeben Text kurz Aufblitzten ( ohne XXX, oder mit allerhöchstens einem) dann kommt eine Felermeldung : vector subscript out of range..., nur weiss ich nicht wo die vector Beschreibung oder so falsch sein sollte, oder wie ich sie verbessern kann.

    http://dict.leo.org/ende?lp=ende&lang=de&searchLoc=0&cmpType=relaxed&sectHdr=on&spellToler=&search=subscript

    In Zeile 36 kann i großer werden als der maximale Index von txt.

    edit: Oh, viel zu spät.



  • for(int i = 0; i< txt.size();++i)
        {  
            for(int loop = 0;loop<disliked.size();++loop)
            {
                if(txt[i] == disliked[loop])
                {cout <<" XXX " ;}
                else if(txt[i] != disliked[loop])
                    {cout << txt[i] << " ";
                     ++i;}}
    
        }
    

    Ich vermute du willst das machen:

    for(int i=0; i<txt.size(); ++i)
    {
        for(int loop=0; loop<disliked.size(); ++loop)
        {
            if(txt[i]==disliked[loop])
            {
                cout << "XXX ";
                break; //höre auf, mit Liste zu vergleichen
            }
        }
        cout << txt[i] << ' ';
    }
    


  • Du erhöhst i zwei mal, das kann ja nicht gut gehen. Zudem solltest du dir das

    if (..)
    { }
    

    abgewöhnen, das ist wirklich kaum erträglich. 😉
    Wenn du mit dem Iteratorkonzept vertraut bist, solltest du auf std::find umsteigen.



  • Du hast nen ++i zuviel drin 🙂



  • Gut das war's auch nicht. So.^^

    for(int i=0; i<txt.size(); ++i)
    {
        for(int loop=0; loop<disliked.size(); ++loop)
        {
            if(txt[i]==disliked[loop])
            {
                cout << "XXX ";
                break; //höre auf, mit Liste zu vergleichen
            }
            if(loop==disliked.size()-1)
            {
                cout << txt[i] << ' ';
            }
        }
    }
    


  • Also, erstmal danke an alle für die vielen tollen Antworten, ich denke diese werden mir sehr helfen. Mit dem ++i wollte ich genau wie Thuruk gesagt hat die Schleifenzahl abbrechen, ich wusste noch nicht, dass break auch für die for-Schleife läuft.

    @cooky451:
    Ich bin noch nicht so lange am Ball ( ich denke ,dass ich std::find erst viel später kennen lernen werde.



  • Sry, für den Doppelpost, aber als Gast hat man eben keine andere Wahl...
    Wenn ich jetzt Thuruks Vorschlag benutze beendet sich das Programm nach Strg+Z sofort selbst, als ob kein cin.get(); vorhanden währe, was kann man da machen?

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
    	string temp;
    	vector<string>txt;
    	vector<string>disliked(10);
    
    	disliked[0] ="Hi";
    	disliked[1] ="Baum";
    	disliked[2] ="Buch";
    	disliked[3] ="Rechner";
    	disliked[4] ="Kamera";
    	disliked[5] ="Steven";
    	disliked[6] ="careful";
    	disliked[7] ="Hilfe";
    	disliked[8] ="Monster";
    	disliked[9] ="Kamel";
    
    	while ( cin>> temp)
    	{txt.push_back(temp);}
    
    	for(int i=0; i<txt.size(); ++i) 
    { 
        for(int loop=0; loop<disliked.size(); ++loop) 
        { 
            if(txt[i]==disliked[loop]) 
            { 
                cout << "XXX "; 
                break; //höre auf, mit Liste zu vergleichen 
            } 
            if(loop==disliked.size()-1) 
            { 
                cout << txt[i] << ' '; 
            } 
        } 
    }  
    
    	cin.get();
    	return 0;
    }
    

    @Thuruk: wofür braucht man das:

    if(loop==disliked.size()-1) 
            { 
                cout << txt[i] << ' '; 
            }
    

    ?



  • Gringham schrieb:

    Wenn ich jetzt Thuruks Vorschlag benutze beendet sich das Programm nach Strg+Z sofort selbst, als ob kein cin.get(); vorhanden währe, was kann man da machen?

    Schreibe diese 2 Anweisungen vor cin.get() :

    cin.clear();
        cin.ignore(100,'\n');
    


  • Gringham schrieb:

    @Thuruk: wofür braucht man das:

    if(loop==disliked.size()-1) 
            { 
                cout << txt[i] << ' '; 
            }
    

    ?

    Das bedeutet soviel wie 'wenn auch beim letzten Element aus *dislike nicht abgebrochen wurde, gibt das Wort aus.'



  • Danke nochmals an alle, dass das Programm jetzt läuft.
    Habe ich es richtig verstanden, dass cin.get();
    vorher noch die beiden anderen cin. Funktionen braucht, weil bei der while-Schleife cin.get(); benutzt werden konnte, und auch, dass bei cin.ignore der Parameter für die maximale länge eingelesener Werte gilt ?



  • Wenn du etwas einließt, z.B. Haus, dann gibst du ja ein: H a u s Enter . Der Eingabeoperator >> holt sich solange Zeichen aus dem Puffer, bis er auf einen Separator stößt. Der Separator ist in diesem Fall Enter . D.h. also, es werden alle Zeichen aus dem Puffer geholt, bis auf Enter. So, jetzt willst du irgendwann nochmal etwas einlesen, in deinem Fall am Ende der main-Funktion via cin.get() . Da aber der Puffer nicht leer ist (das Enter steckt noch drin), wird nicht auf eine Eingabe gewartet, sondern ein im Puffer übriges Zeichen geholt. Wie du gemerkt hast, ist das für den Anwender natürlich blöd. Darum musst du vor der entsprechenden Leseoperation den Puffer erst mit ignore() leeren und ggf. den Stream mit clear() wieder als gültig kennzeichnen ( clear() wäre in deinem Fall aber nicht nötig.)

    Nun noch kurz zu der Methode ignore() : Diese Methode ignoriert (ignorieren = Zeichen lesen und dann verwerfen) Zeichen aus dem Puffer. Dieser Vorgang ist beendet, wenn entweder 100 Zeichen ignoriert wurden oder sobald man auf '\n' stößt ( '\n' wird dann ebenfalls ignoriert). In deinem Fall trifft letzteres zu.


Log in to reply