C++, Aufgabenproblem mit strings !DRINGEND!



  • Hallo erstmal, ich habe folgende Aufgabe bekommen und komme irgendwie nicht weiter. Die Aufgabe ist auf Mittwoch 22:00 zu lösen und es gibt noch einiges an Arbeit, deshalb hoffe ich auf baldige Hilfe.

    Hier einmal die Aufgabenstellung:

    Ziel
    ----

    Stringhandling, Array und Zeigerarithmetik

    Ausgangslage
    -------------
    Wir schreiben uns unsere eigenen String-Funktionen. Auch wenn die Standardbibliothek string.h viele solche Funktoinen enthält, fehlt machmal eben trotzdem die eine oder andere.

    Aufgabenstellung
    ----------------

    Teilaufgabe 1
    ------------
    Schreiben Sie eine Funtklin ( strchcat()9, die es erlaubt, an einen String ein einzelnes Zeichen anzuhängen. Das Zeichen wird an den bestehenden String angehängt und dessen Länge um ein erhöht. Es muss also genügend Speicherplatz für den bestehenden String vorhanden sein, um diese Verlängerung machen zu können.

    Teilaufgabe 2
    -------------
    Manchmal hat ein String, der z.B. aus einer Datei gelesen wird, an Ende noch einige Leerzeichen. Schreiben Sie eine Funktion rightTrim(), die einen String am Ende so verkürzt, dass alle eventuall vorhandenen Leerzeichen abgeschnitten werden.

    Teilaufgabe 3
    -------------
    Schreiben Sie eine Funktion leftTrim(), die bei einem String alle am Anfang stehenden Leerzeichen entfernt. Der String wird dadurch eventuell kürzer.

    Teilaufgabe 4
    -------------
    Kombinieren Sie nun die Funktionalität aus den Teilaufgaben 2 und 3 in einer Funktion trim().

    Teilaufgabe 5
    -------------
    Schreiben Sie eine Funktion replaceChar(), die in einem gegebenen String ein vorgegebenes Zeichen durch ein anderes ersetzt. Z.B. werden alle A durch X ersetzt.

    Teilaufgabe 1 hab ich schon folgendermassen gelöst:

    /*
    Programmname:   118_sag_03-05-1.cpp
    Beschreibung:
    Plattform:      Ab Windows 98 tauglich, nicht für Linux
    Version:        1.0
    Erstellt am:    10.01.2005
    Ersteller:      Sascha Gschwind
    Aenderungen:
    */
    
    // Bibliotheken einbinden
    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <cmath>
    
    // Namensraum festlegen
    using namespace std;
    
    // Funktionsprototypen deklarieren
    void fehler(void);
    std::string strchcat(std::string str, char c);
    // Hauptprogramm
    int main()
    {
        char wiederhole ='j';
        char eing_s[100];
        std::string test="abcd";
        // Programm 
        do
        {   
            system("cls");
            fflush(stdin);
            std::cout << test << std::endl;
            std::cout << strchcat(test,'e') << std::endl;
            // Wiederholungsabfrage
            cout<<"\n";
            cout<<" Wiederholen(j)?  ";
            cin>>wiederhole;
        } while (wiederhole =='j');
    
       // Pause (Warten auf Programmende)  
       cout<<" Betaetigen Sie die Enter/Return Taste...\n";
       fflush(stdin);
       getchar();
       return(0);
    }
    
    // Funktionen definieren
    void fehler(void)
    {
        printf(" Falsche Eingabe, bitte wiederholen!\n");  
    }
    std::string strchcat(std::string str, char c)
    {
                return str+c;
    }
    

    Bei der Teilaufgabe 2, 3 und 4, welche ja in etwa das gleiche sind bin ich auf die Funktion substr gestossen, doch ich finde keine Erklärung und kein schlaues Beispiel zu dieser Funktion, deshalb habe ich keine Ahnung wie ich diese Funktion einbauen sollte. Ich hoffe ihr könnt mir mit dem Programmcode hier, den ihr gerne als Basis nehmen dürft, gleich die Aufgabe posten oder mir die Funktion mit einem Beispiel erklären. Wie schon gesagt ist es ziemlich dringend.

    Ich bedanke mich im voraus.

    Mfg nakra



  • Wenn ich die Aufgabe richtig interpretiere, sollst du doch gerade nicht
    die C++ std::strings benutzen, oder? Dabei hättest du nämlich mit Zeiger-
    arithmetik nicht viel zu tun. (Siehe deine Teilaufgabe 1.) Wie sieht's denn
    mit deinem Wissen über C-Strings und Zeigern aus?



  • Ich weiss, man hätte es in Standard C lösen sollen, doch ich habe gefragt ob ich es auch so machen kann und ein Ja bekommen. Ich würd mich nicht gerade als stark in der hinsicht bezeichnen, ich lerne erst ganz langsam seit nem halben jahr und wir sind gerade bei dem Thema angelangt.



  • 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