char array buchstaben mit 2 buchstaben ersetzen



  • wie kann man in einem char array 1 buchstabe mit 2 oder 3 buchstaben ersetzen? hat jemand ein beispiel?
    std::string darf ich nicht verwenden.



  • • Buchstaben suchen,
    • Teil davor kopieren,
    • zu ersetzende Zeichen kopieren,
    • Teil danach kopieren.

    In etwa so (ungetestet):

    // #include <algorithm> …
    char* replace(char const* text, char needle, char const* repl) {
        size_t len = strlen(text);
        char* pos = find(text, text + len, needle);
        if (pos == text + len)
            return text;
    
        size_t repl_len = strlen(repl);
        char* ret = new char[len + repl_len - 1];
        copy(text, pos, ret);
        copy_n(repl, repl_len, ret - text + pos);
        copy_n(pos + 1, len - (pos - text), ret - text + pos + repl_len);
        return ret;
    }
    

    Enthält garantiert off-by-one-Fehler und soll nur das Prinzip illustrieren.



  • Danke schonmal! 🙂
    Sieht nach viel Mühe aus 😉
    Aber ich bekomme folgende Fehler:

    1>.\main.cpp(16) : error C3861: "find": Bezeichner wurde nicht gefunden.
    1>.\main.cpp(18) : error C2440: 'return': 'const char *' kann nicht in 'char *' konvertiert werden
    1>        Durch die Konvertierung gehen Qualifizierer verloren
    1>.\main.cpp(22) : error C3861: "copy": Bezeichner wurde nicht gefunden.
    1>.\main.cpp(23) : error C3861: "copy_n": Bezeichner wurde nicht gefunden.
    1>.\main.cpp(24) : error C3861: "copy_n": Bezeichner wurde nicht gefunden.
    

    Du sagtest ja, dass es Fehler enthält, aber ich programmiere (bzw lerne) erst seit 5 Monaten, da verstehe ich ehrlich gesagt nicht alles so richtig in Deiner Funktion 😞



  • Ich wette, Du hast die Kommentarzeichen mitkopiert ... und deswegen "algorithm" nicht includiert ...

    Merke: Hier werden nicht immer reine Kopiervorlagen geliefert, sondern oftmals ein wenig das eigene Nachdenken eingefordert ... 😉

    Gruß,

    Simon2.



  • char array[] schrieb:

    Du sagtest ja, dass es Fehler enthält, aber ich programmiere (bzw lerne) erst seit 5 Monaten, da verstehe ich ehrlich gesagt nicht alles so richtig in Deiner Funktion 😞

    Wenn du das programmieren willst, solltest du auch in der Lage sein, es zu verstehen. Was bringt es dir, wenn du ein Programm hast, das zwar läuft, aber du keine Ahnung hast, wie man so etwas programmiert? In dieser Hinsicht ist es gerade gut, dass der Beispielcode Fehler enthält, denn bei Copy&Paste lernst du nichts.

    Und falls du doch motiviert bist, den Code zu verstehen, wäre es vielleicht auch nützlich, wenn du uns mitteilen würdest, was du nicht genau verstehst, damit dir auch geholfen werden kann.



  • char arry[] schrieb:

    ...std::string darf ich nicht verwenden.

    Aufgabe: "2 Ohrfeigen für den Aufgabensteller !"
    😉

    Gruß,

    Simon2.



  • Naja ich versteh schon was da abläuft, ist ja klar. Aber copy_n ist nicht im algorithm header drinne 😉
    Ich habs sicherlich auch nicht einfach so kopiert 😉



  • Sorry, was ich vergessen habe:
    Warum übergibt man

    char const *text
    

    und

    char const *rep
    

    . Warum nicht ohne Const?



  • Damit soll sichergestellt werden, dass text bzw. repl nicht verändert werden.
    Ich weiss nicht genau, was einige der Funktionen ( copy etc.) machen, eventuell verlangen sie auch konstante Parameter.



  • Simon2 schrieb:

    char arry[] schrieb:

    ...std::string darf ich nicht verwenden.

    Aufgabe: "2 Ohrfeigen für den Aufgabensteller !"
    😉

    Gruß,

    Simon2.

    Hör auf zu labern!

    Gruß!



  • mhhh ok.
    Da ich n_copy wohl nicht habe... Könnte jemand einen Denkanstoß geben wie es noch zu realisieren wäre?



  • char array[] schrieb:

    mhhh ok.
    Da ich n_copy wohl nicht habe... Könnte jemand einen Denkanstoß geben wie es noch zu realisieren wäre?

    Das könnte man z.B. mit einem vector<char> realisieren!
    😉



  • ich bekomme so komische fehler, wenn ich das mache:

    std::vector<char*> text;
    	std::vector<int>::iterator it;
    	it = text.begin();
    

    Fehler:

    error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::_Vector_iterator<_Ty,_Alloc>' akzeptiert (oder keine geeignete Konvertierung möglich)
    

    Genauso bei for-Schleifen:

    error C2664: 'std::_Vector_iterator<_Ty,_Alloc> std::vector<_Ty>::erase(std::_Vector_const_iterator<_Ty,_Alloc>)': Konvertierung des Parameters 1 von 'std::_Vector_iterator<_Ty,_Alloc>' in 'std::_Vector_const_iterator<_Ty,_Alloc>' nicht möglich
    

    und mehr Fehler davon, wenn ich so eine for-schleife machen möchte:

    for (it=text.begin(); it<text.end(); it++)
    {...}
    


  • char array[] schrieb:

    mhhh ok.
    Da ich n_copy wohl nicht habe... Könnte jemand einen Denkanstoß geben wie es noch zu realisieren wäre?

    Merde, ich sehe gerade, dass das nicht Teil des Standards ist. Sorry. Man kann das ganze aber durch 'copy' ersetzen.

    … oder Du schreibst es Dir selbst:

    template <typename TIterIn, typename TSize, typename TIterOut>
    TIterOut copy_n(TIterIn begin, TSize count, TIterOut result) {
        while (count-- > 0)
            *result++ = *begin++;
        return result;
    }
    


  • vector<char> nicht vector<char*> !
    In 'ner Schleife das Ursprungsarray buchstabenweise mit push_back(const char&) verändert in den vector<char> einfügen.
    Dann holste Dir den Zeiger auf das erste Element des vectors (&front()), der erlaubt Dir Zugriff wie bei einem C-Array (char*).
    😉



  • Danke, aber es sind immernoch die selben Fehler 😉

    @Konrad Rudolph: Danke, ich muss jetzt nurnoch herausgfinden was genau an Deiner Funktion nicht geht 😉



  • char array[] schrieb:

    Danke, aber es sind immernoch die selben Fehler 😉

    @Konrad Rudolph: Danke, ich muss jetzt nurnoch herausgfinden was genau an Deiner Funktion nicht geht 😉

    #include <iostream>
    #include <vector>
    
    int main()
    {
    	const char verdopple   = 'l';
    	const char marray[] = "Helo Wor.d!";
    	std::vector<char> a;
    
    	for (int i= 0; i < sizeof marray; i++)
    	{	
    		a.push_back(marray[i]);
    		if (marray[i] == verdopple)
    			a.push_back(marray[i]);
    	}
    	std::cout << &a.front() << std::endl;
    }
    

    :p



  • Umhergelaber schrieb:

    ...
    Hör auf zu labern!

    Gruß!

    Mach's vor - wie geht denn das ?

    Gruß!



  • Umhergelaber schrieb:

    Simon2 schrieb:

    char arry[] schrieb:

    ...std::string darf ich nicht verwenden.

    Aufgabe: "2 Ohrfeigen für den Aufgabensteller !"
    😉

    Gruß,

    Simon2.

    Hör auf zu labern!

    Gruß!

    👍



  • realcoder schrieb:

    ...👍

    Du hast doch nur einen zu kleinen Penis, um selbst etwas zu schreiben.

    Hör auf zu labern!

    Gruß!


Log in to reply