C++, Aufgabenproblem mit strings !DRINGEND!



  • Ich hoffe dass bis morgen ein bisschen aktiver in diesen Thread investiert wird, denn ich muss leider auf euch bauen. Ich hab mich heute den ganzen Tag mit dem i-net rumgeschlagen und kaum was schlaues gefunden...



  • Schau dich mal auf www.pronix.de und dann unter c um.
    Dort werden Strings gut gezeigt.



  • das ganze ist ja schön und gut, doch leider nur c, ich will das ganze aber in c++ lösen, denn damit hab ich schon angefangen... aber danke schonmal dass du dich gemeldet hast



  • hi!
    hab grad lust gehabt die ersten 2 aufgabe zu machen, die anderen sind für dich...

    infos zur string klasse der stl:
    http://cplus.kompf.de/artikel/strings.html
    http://www.msoe.edu/eecs/cese/resources/stl/string.htm
    http://www.hlrs.de/people/mueller/tutorials/script/scriptse30.html

    Teilaufgabe1:
    ----------------------------------------------

    string strcat(string str, const char token)
    {
    	return str += token;
    }
    
    int main() 
    { 
    	std::string str1("Hallo");
    	cout << "String=" << str1 << endl;
    	cout << "Stringlanege=" << str1.size() << endl;
    	str1 = strcat(str1, 'h');
    	cout << "String=" << str1 << endl;
    	cout << "Stringlanege=" << str1.size() << endl;
    
            return 0;
    }
    

    Teilaufgabe2:
    ----------------------------------------------

    string rightTrimt1(string str)
    {
    	string str2;
    
    	int pos1 = 0;
    	int pos2 = 0;
    	bool c = false;
    	do
    	{
    		pos2 = str.find(" ", pos1);
    		if(pos2 != string::npos) {
    			c = true;
    			str2 += str.substr(pos1, pos2-pos1);
    			pos1 = pos2+1;
    		}
    		else {
    			if(c == true) {
    				str2 += str.substr(pos1, str.size());
    			}
    		}
    
    	}while(pos2 != string::npos);
    
    	return str2;
    }
    
    string rightTrimt2( string s, const char *from, const char *to )
    {
        unsigned pos = 0, len = strlen( from );
    
        while ((pos = s.find( from, pos )) != s.npos)
        {
            s.replace( pos, len, to );
        }
    
    	return s;
    }
    
    int main() 
    { 
    	std::string str1("H a l l                  o");
    	cout << "String=" << str1 << endl;
    	str1 = rightTrimt1(str1);
    	cout << "String=" << str1 << endl;
    
    	str1 = "H a l l                  o";
    	cout << "String=" << str1 << endl;
    	str1 = rightTrimt2(str1, " " , "");
    	cout << "String=" << str1 << endl;
    
            return 0;
    }
    


  • Hallo,
    wenn du wirklich std::string benutzen willst, dann schau dir diesen FAQ-Beitrag an:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39468.html
    Danach kannst du alle Aufgaben lösen.

    Eine Übersicht aller String-Methoden hilft wahrscheinlich auch:
    http://www.sgi.com/tech/stl/basic_string.html

    Tip zu Teilaufgabe 2:
    std::string besitzt eine Methode find_last_not_of

    Tip zu Teilaufgabe 3:
    std::string besitzt eine Methode find_first_not_of

    Tip zu Teilaufgabe 5:
    Steht im FAQ-Beitrag.

    Ganz ehrlich: Unter Verwendung der Klasse std::string sollte jeder Visual Basic-Programmierer diese Aufgabe innerhalb von 1 1/12 Stunden lösen können.

    Interessanter wird es mit den alten C Strings. Gerade wenn du Zeiger und Strings (nicht std::string) noch nicht so verstanden hast, solltest du diese Aufgabe mal in C lösen.



  • und am besten ohne C-stdlib funktionen ^^ 😃 Sondern nur mit selbstgeschrieben funktionen. Schaden tut das bestimmt nicht. Man lernt dabei ne menge.

    MfG



  • Das ist ja wohl sowas von simpel...

    Außerdem soll es ja wohl eindeutig ohne fertige String-Funktionen gelöst werden... Ansonsten macht das doch gar keinen Sinn.

    Das wäre ja so als wenn ein Schreiner in seiner Ausbildung die Aufgabe bekommt einen Stuhl zusammenzubauen und fragt, ob er ihn auch im Baumarkt fertig kaufen darf... lol


  • Mod

    ein paar anmerkungen:
    string.h ist antiquiert, dass du auf std::string zugreifen kannst dürfte an <iostream> liegen, der korrekte header ist aber trotzdem <string>

    void fehler(void)
    {
        printf(" Falsche Eingabe, bitte wiederholen!\n");  
    }
    

    das sieht wie ein C relikt aus, und da du sonst auch cout benutzt, solltest du hier. evtl auf printf verzichten - einfach der konsistenz wegen. aufgrund des
    using namespace std; kannst du auch darauf verzichten, string jedesmal mit std:: zu qualifizieren.

    ansonsten enthält der beitrag von Hume alles was du brauchst.



  • mein beitrag kommt ja zugegebenermaßen etwas spät, aber besser spät als nie 😃

    zu 1: funtion strchrcat()
    also du nimmst erst mal den funktionskopf *void strchrcat(char str, char c). wenn jetzt jemand jammert, daß man das auch anders machen kann, dann vergiss das! du bist ja noch anfänger und deshalb mach ichs jetzt auch anfängermäßig.

    dann suchst du in str nach dem null-byte. das geht, indem du in einer schleife so lange 1 auf str aufaddierst, bis *str==0 ist. wenn du das gemacht hast, dann enthält str den zeiger auf das nul-byte, dh das string-ende, jetzt mußt du nur noch das nul-byte mit c überschreiben und dahinter ein neues nul-byte setzten (nicht vergessen!).

    zu 2: funktion rightTrim()
    du nimmst den funktionskopf *void rightTrim(char str). dann suchst du wieder wie bei strchrcat() nach dem nul-byte. aber diesmal kopierst du str erst in eine lokale variable *char cp und führst den suchvorgang dann mit cp aus. denn den zeiger auf den anfang des strings brauchen wir nachher noch. wenn du nun in cp den zeiger auf das string-ende (dh das nul-byte) hast, dann machst du eine schleife, in der du von cp so lange eins abziehst, bis cp nicht mehr auf ein leerzeichen zeigt (dh *cp!=' ' ist). wenn du das gemacht hast, dann zeigt cp auf das letzte zeichen im string, das kein leerzeichen ist. jetzt mußt du hinter dieses zeichen nur noch eine null setzen und dann ist der string da zu ende und die leerzeichen am ende sind abgeschnitten.

    zu 3: funktion leftTrim()
    schon ein bißchen schwieriger. du nimmst den funktionskopf *void leftTrim (char str). erst mal mußt du das erste zeichen hinter den führenden leerzeichen finden. dazu legst du erstmal wie bei rightTrim() eine variable cp an und kopierst da den wert von str rein. dann machst du eine schleife, die so lange eins auf cp aufaddiert wie cp auf ein leerzeichen zeigt (dh *cp==' ' ist). wenn du damit fertig bist, dann zeigt cp auf den left-getrimmten string. jetzt mußt du den "nur" noch nach die addresse str kopieren.

    zu 4: funktion trim()
    das bekommst du wohl gerade noch alleine zuwege 😃

    zu 5: funtion replaceChar()
    funktionskopf void replaceChar(char *str, char alt, char neu)
    mache eine schleife, die so lange eins auf str aufaddiert, wie str nicht auf das nul-byte zeigt. in der schleife prüfst du dann, ob str auf das zeichen alt zeigt (dh *str==alt). wenn ja, dann ersetzt du das alte zeichen durch neu (dh *str=neu). fertig.

    ich hoffe du bekommst die aufgabe in den paar stunden noch auf die reihe 👍



  • ich bedanke mich schon einmal im voraus bei euch allen! ich werde mich gleich einmal weiter daran machen und hoffe, dass ich noch fertig werde 😉 Danke noch einmal!


Anmelden zum Antworten