String kopieren/ersetzen mit eigener Funktion



  • Es gibt keinen Weg die Größe der angelegten Arrays s1 und s2 aus der main() zu ändern, also während der Laufzeit z.B. mehr Speicher für s1 oder s2 bereitzustellen.

    Du hast somit auch keine Möglichkeit ein größeres Array vollständig in ein kleineres zu kopieren. Das ist unmöglich. Den Überlauf verhinderst du nur damit rechtzeitig mit dem Kopieren aufzuhören.



  • Irgendetwas wirst Du am Programm ändern müssen - seine Implementierung oder seine gewünschte Funktion, denn die beiden passen einfach nicht zueinander.
    wie wäre es mit Folgendem:

    ...
    int main() {
      char s1[] = "123456789123456789123456789123456789";
      char s2[sizeof(s1)] = "cdef";
    
    ...
    

    ?

    Noch besser: std::string nutzen und sich mit wirklich Interessantem beschäftigen. 😉

    Gruß,

    Simon2.



  • Abgesehen davon, dass ich s1 und s2 vertauschen würde, dann die Parameter vernünftig bennenen würde und source const sein sollte,
    leistet die (C-)Funktion das, was ich von ihr erwarten würde.
    Da muss sich in C halt der Aufrufer drum kümmern, das genug Platz im String vorhanden ist.



  • Javun schrieb:

    Nur leider tritt bei diesem Programm ein Speicherzugriffsfehler auf, da s2[] nicht die gleiche größe hat wie s1[].

    Genauer:
    s1 ist vom Typ char[37]
    s2 ist vom Typ char[5]
    Dass Du hier char[] schreiben kannst, liegt an Initialisierungs-Sonderregeln. Der Compiler vervollständigt den Typ zu char[37] bzw char[5] indem er zählt, wieviele Zeichen Deine Initialisierer haben.

    Javun schrieb:

    Wie schaffe ich es nun diesen Fehler zu beheben?!
    Es darf natürlich nur etwas in der Funktion geändert werden.

    Ganz einfach:

    void dstrcpy(char *s1, char *s2)
    {
    }
    

    Problem behoben. 😃
    Du hast nicht gesagt, was dstrcpy eigentlich machen soll. Da man die Größe von solchen Arrays wie s1 und s2 nicht nachträglich ändern kann, kann ich mir auch nicht zusammenreimen, was ein "korrektes" dstrcpy hier eigentlich machen soll.

    kk



  • Es geht bei dieser Funktion einfach darum einen beliebig langen String in einen beliebigen kurzen zu kopieren. An der main() soll daher auch nichts geändert werden.
    Die Funktion dstrcpy muss so angepasst werden, dass es den Kopiervorgang erfolgreich abschließt. Möglich ist dies aufjedenfall, da mir diese Aufgabe in der Uni gestellt wurde und die Lösung auch eigentlich recht simpel sein soll. Nur leider komme ich nicht darauf...



  • Javun schrieb:

    Es geht bei dieser Funktion einfach darum einen beliebig langen String in einen beliebigen kurzen zu kopieren.

    Sofern du mit dynamischen Strings arbeitest (wie std::string) ist dies auch möglich, nicht aber mit statischen C-Arrays deren Größe du schlicht und ergreifend nicht mehr zur Laufzeit ändern kannst. Das ist auch völlig unabhängig davon wie die Aufgabenstellung ist, es ist schlicht und ergreifend nicht möglich.

    Eine andere Alternative ist es, wenn diese Arrays dynamisch alloziert werden (Sprich Zeiger und new[]/delete[] bzw. falls das eine C-Frage und nicht C++ per malloc/free), und du den Speicherbereich des kleineren löschst und entsprechend neu allozierst.

    Javun schrieb:

    An der main() soll daher auch nichts geändert werden.

    Dann ist die Lösung nicht möglich. Ich gehe dann eher davon aus das der Inhalt des kleinen Arrays in das große Array übertragen werden soll. Oder: das nur der Teil kopiert werden soll, der in das Zielarray wirklich hinein passt.



  • genaue aufgabenstellung?
    (copy & paste bitte)

    dann gibts auch ne einfache antwort ;o)

    bb



  • Javun schrieb:

    Möglich ist dies aufjedenfall

    nö. nicht mit den von dir dargestellten rahmenbedingungen.

    die einfachste lösung heisst jedenfalls "std::string verwenden".

    ru,
    cirion



  • void dstrcpy(char const* s1, char* s2) {
      int i = 0;
      while (*s1 != '\0' && *s2 != '\0')
        *s2++ = *s1++;
    }
    

    Kopiere solang bis entweder s1 oder s2 "zu Ende" ist. D.h. für Dein Beispiel das es nur die ersten 4 Zeichen von s1 nach s2 kopiert und gut ist. Funktioniert btw. auch nur solang die Strings null-terminiert sind (bei konstant-langen Strings wie in Deinem Beispiel durch den Compiler gegeben, bei dynamisch alloziierten Strings muss man dies selber tun).

    Gut Schuß
    VuuRWerK 😉



  • Javun schrieb:

    Es geht bei dieser Funktion einfach darum einen beliebig langen String in einen beliebigen kurzen zu kopieren. ...

    garantiert nicht.

    Machen wir das einfach mal ganz ohne Programmiersprache:
    "Schaufele einen Kubikmeter Sand in eine 1-Literflasche" ist das Äquivalent zu Deiner Aufgabe.

    Ich vermute, dass
    a) die Lösung von VuuRWerK das Gewünschte ist oder
    b) die Anlage eines neuen Arrays (z.B. mit new )
    gemeint ist.
    So wie Du die Aufgabe beschrieben hast, ist sie nicht lösbar.
    Vermutlich hast Du die Vorgabe "... mit beliebig langen Strings ..." mißverstanden (gemeint: "Die Funktion soll keine feste Stringlänge voraussetzen"; verstanden: "Die Funktion soll mit jeder Stringlänge alles kopieren").

    Gruß,

    Simon2.



  • Javun schrieb:

    Es geht bei dieser Funktion einfach darum einen beliebig langen String in einen beliebigen kurzen zu kopieren.

    Bestimmt nicht.

    Sicher, dass Du Quelle und Ziel nicht verwechselt hast?

    Hat das d in dstrcpy noch eine besondere Bedeutung?

    Bei der Standard-C-String-Funktion (strcpy) kommt der Ziel-Parameter auch vor dem Quell-Parameter.

    kk


Anmelden zum Antworten