string-element über eine Funktion "trimmen"



  • Hi, ich muss einen eingegeben String über eine Funktion trimmen, falls ein "+" in dem String vorkommt.
    Das Problem ist, dass durch die return anweisung der gesamte String an den aufrufer zurückgeht.
    Im Debugger sieht man, dass die If-Anweisung bei str[i] -> '+' übersprungen wird. Aber es wird dennoch der alte str wieder übergeben. Ich darf keine extrafunktionen o.ä. verwenden...
    Ich finde den Fehler einfach nicht, bwz es müsste etwas mit der return-anweisung sein.
    Ich würde gerne return str[i] übergeben, aber da streikt der compiler.. das geht wohl nicht.
    Egal hinter welche klammer ich die return anweisung setze, kommt immer das selbe Ergebnis raus:

    vorher: ++++eingabe++
    nachher: ++++eingabe++

    es soll aber so sein :
    vorher: ++++eingabe++
    nachher: eingabe

    string trimme(string str) //funktion
    {
    	for (int i = 0; i < str.length(); i++)
    	{
    		if (str[i] != '+')
    		{
    			return str;
    		}
    	}
    }


  • Schau dir mal die Funktionen der Klasse std::string an...



  • @Th69 ich darf keine extra funktionen verwenden 😕
    außer .at() und .length()Durchgestrichen



  • Dann ist die Aufgabe nicht lösbar, denn auch [i] ist eine Funktion (bzw. Operator) der std::string-Klasse (denn du mußt ja den übergebenen String verändern bzw. einen neuen String erzeugen - und somit dessen Klassenfunktionen benutzen).



  • @Th69
    wäre es lösbar, wenn man nicht jedes zeichen überprüfen müsste? Also nur die zeichen, die vor und nach den Buchstaben stehen?

    zb:
    vorher : ++++mon++a+++
    nachher: mon++a



  • @Th69 ich meine mit extra funktionen die Punkte aus der Liste, die du verlinkt hast. Von denen darf ich nur .at() und .length() verwenden



  • OK, ich nehme jetzt mal an, daß man wenigstens einen Konstruktor (außer dem Standardkonstruktor) benutzen darf:

    std::size_t pos, count;
    // ...
    return std::string(str, pos, count);
    

    Jetzt mußt du nur pos und count herausfinden.



  • @Th69 ich versuche es gleich mal.. ich probier gerade einen anderen ansatz aus
    danke 🙂



  • Ich glaube nicht, dass das so gemacht werden soll, wie @Th69 vorgeschlagen hat. Ohne eine genaue Aufgabenstellung ist das aber Rumraterei.



  • @Jockelx die genaue aufgabestellung lautet:

    (Funktionen, Schleifen, string)
    Schreiben Sie eine Funktion …
    string trimme(string s)
    … welche die "getrimmte/bereinigte Form" von s zurückgibt.
    "Bereinigen" bedeute dabei, dass Pluszeichen am Anfang und/oder am
    Ende von s nicht mit ins Resultat übernommen werden, alle anderen
    Zeichen des Strings s hingegen schon.
    Pluszeichen innerhalb des Strings sollen durch die Funktion nicht
    verändert werden.

    Anmerkung (für diejenigen, die diese Systemfunktionen kennen):
    Systemfunktionen der C++ strings wie erase(), resize() etc. sind
    verboten! Nur Konstrukte, die wir auch in der Vorlesung behandelt haben:
    length(), at(), + und += auf Strings, …

    Hauptprogramm zum Testen:

    int main()
    {

    string s = "";
    cout << "Bitte geben Sie den Text ein: " << endl;
    getline(cin, s);
    
    cout << "Vorher: " << s << endl;
    cout << "Nachher: " << trimme(s) << endl;
    
    
    system("PAUSE");
    return 0;
    

    }



  • @mmm_1482_ sagte in string-element über eine Funktion "trimmen":

    , + und += auf Strings,

    Und schon sieht die Sache völlig anders aus!



  • Also auf die schlechteste Art...



  • @Jockelx ich weiß gerade nicht, wie ich das anwenden kann XD bzw das mein problem löst



  • Du mußt quasi den von mir erwähnten Konstruktor nachbauen, d.h. mittels einer Schleife die einzelnen Zeichen per += (zu einer neuen string-Variable) hinzufügen (und vorher die passenden Indizes für die Schleife berechnen).



  • @Th69 okay danke ich versuch das mal 😃



  • du könntest auch sowas machen:

    int numplus;
    
    //anzahl der plusse am anfang zählen
    numplus = 0;
    for(int i = 0; i < str.length(); i++)
    {
         if(str[i] != '+')
         {
              break;
         }
         numplus++;
    }
    
    //alle zeichen hinter dem letzten vorderen plus nach "vorne" kopieren
    for(int i = 0; i < str.length() - numplus; i++)
    {
         str[i] = str[i + numplus];
    }
    
    //alle plusse am ende der zeichenkette löschen
    for(int i = str.length() - 1; i >= 0; i--)
    {
         if(str[i] == '+')
         {
              str[i] = 0;
         }
         else
         {
              break;
         }
    }
    
    


  • @Wade1234 sagte in string-element über eine Funktion "trimmen":

    //alle plusse am ende der zeichenkette löschen
    for(int i = str.length() - 1; i >= 0; i--)

    Huiuiui...

    Ich würde von dieser Variante abraten. Insbesondere wenn man mal einen Leerstring einsetzen will 🙂

    Ich vermute, dass man es so machen soll:

    string trimme(string s) {  // const string &? oder hattet ihr das noch nicht?
        size_t end_idx = s.length();
        while (end_idx && s[end_idx - 1] == '+') --end_idx;
        size_t start_idx = 0;
        while (s[start_idx] == '+') ++start_idx;
        string result;
        for (int i = start_idx; i < end_idx; ++i)
            result += s[i];
        return result;
    }
    


  • @wob daanke 😃 ich versuch das jetzt mal zu verstehen, aber es funktioniert!

    thema referenzen hatten wir und dürfen wir auch verwenden



  • @wob size_t dürfen wir leider nicht verwenden, gibt dafür eine alternative?



  • @wob hab schon gesehen unsigned int geht auch 🙂


Log in to reply