Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » String kopieren/ersetzen mit eigener Funktion

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.06.2010, 04:54 Uhr
Javun



Folgender Code ist gegeben:


C++:
#include <iostream>

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

  int i = 0;
  while(*s1 != '\0') {
    *s2++ = *s1++;
  }
}

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

  dstrcpy(s1, s2);

  return 0;
}


Nur leider tritt bei diesem Programm ein Speicherzugriffsfehler auf, da s2[] nicht die gleiche größe hat wie s1[]. Wie schaffe ich es nun diesen Fehler zu beheben?! Es darf natürlich nur etwas in der Funktion geändert werden.

Vielen Dank schon Mal für die Hilfe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.06.2010, 08:12 Uhr
ao

(Operator)


Normalerweise gilt bei String-Copy-Funktionen die Vereinbarung, dass vom zweiten auf den ersten String kopiert wird, also von s2 nach s1, vergleiche hier: www.cppreference.com/wiki/c/string/strcpy .

Du machst es umgekehrt und versuchst, den langen String in den kurzen zu kopieren. Klar, dass das nicht passt.

Außerdem fehlt bei dir noch die Terminierung. Du kopierst zwar Zeichen für Zeichen, vergisst aber die Null am Ende.

Dieser Post wurde am 07.06.2010 um 08:14 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.06.2010, 11:33 Uhr
Javun




Zitat von ao:
Normalerweise gilt bei String-Copy-Funktionen die Vereinbarung, dass vom zweiten auf den ersten String kopiert wird, also von s2 nach s1, vergleiche hier: www.cppreference.com/wiki/c/string/strcpy .

Du machst es umgekehrt und versuchst, den langen String in den kurzen zu kopieren. Klar, dass das nicht passt.

Außerdem fehlt bei dir noch die Terminierung. Du kopierst zwar Zeichen für Zeichen, vergisst aber die Null am Ende.


Das die Terminierung fehlt ist korrekt, das hat aber nichts mit dem Speicherüberlauf zu tun.

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, 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...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.06.2010, 12:19 Uhr
ao

(Operator)



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

Einen langen in einen kurzen? Missverständnis ausgeschlossen? Das geht nur, wenn die Funktion den Destination-Speicher neu allozieren darf (realloc oder delete[] und new).

Dazu muss aber der formale Parameter s2 ein Doppelpointer sein (char ** s2), damit der neue Pointer an main zurückgereicht werden kann, und dazu muss die Signatur von dstrcpy und die main-Routine geändert werden.

Es passt also irgendwie nicht zusammen, daher die Aufgabe nochmal genau lesen, oder noch besser hier posten - vielleicht fällt uns was auf, was du überlesen hast.


Zitat:
Möglich ist dies, da mir diese Aufgabe in der Uni gestellt wurde ...

Ah ja, und die Uni hat natürlich immer Recht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.06.2010, 13:18 Uhr
0xdeadbeef
Gott
(Operator)


Ich vermute, dass stumpf gemeint ist, die Größe des Buffers s2 explizit anzugeben, so dass er größer ist als der darin enthaltene (und, wichtig, der reinzukopierende) String ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.06.2010, 19:03 Uhr
Hans
Library Walker
(Operator)


Hi,

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


Zitat von ao:
Einen langen in einen kurzen? Missverständnis ausgeschlossen? Das geht nur, wenn die Funktion den Destination-Speicher neu allozieren darf (realloc oder delete[] und new).

Entweder das, oder Du schneidest vom langen String das ab, was in den kurzen nicht mehr rein passt. Das ist allerdings übelstes gehacke und produziert Speicherlecks. Nebenbei stellt sich die Frage, ob das wirklich gewünscht wird.

Dann frage ich mich, wozu die Variable i in Deiner Funktion gut sein soll, wenn Du sie nicht benutzt?

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.06.2010, 17:19 Uhr
banshee




Zitat von Hans:
Das ist allerdings übelstes gehacke und produziert Speicherlecks.


Wieso das? Kann man nicht vorher abfragen, wie groß s1 ist und das Kopieren dann vorher einfach abbrechen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.06.2010, 17:29 Uhr
ao

(Operator)


Hab ich auch nicht verstanden, aber eigentlich müsste sich Javun jetzt melden und die Aufgabe noch mal genau erklären, alles andere führt meiner Meinung nach nicht weiter.
Dieser Post wurde am 10.06.2010 um 17:30 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.06.2010, 00:01 Uhr
Hans
Library Walker
(Operator)


Hi,

okay, vielleicht hab ich mich etwas übertrieben ausgedrückt, aber was ich meine ist: Wenn er 2 Strings hat, und einen langen String ohne realloc/new & Co. in einen kurzen kopiert, oder jedenfalls das kopiert, was in den kurzen herein passt, dann hat er den langen String zerschnitten, und das, was davon abgeschnitten ist, liegt nutzlos im Speicher herum, weil man nicht mehr drauf zugreifen kann.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.06.2010, 08:22 Uhr
ao

(Operator)


Auch das geht nicht, weil dstrcpy gar nicht wissen kann, wieviel freier Platz in s2 drin ist. Das müsste über einen weiteren formalen Parameter mitgeteilt werden.

Oder es müssten zusätzliche Vereinbarungen gelten, z.B. so, dass s2 in voller Länge als gültiger String initialisiert sein muss, damit er mit strlen gemessen werden kann. Aber das ist für die Praxis auch zu kompliziert.

Jedenfalls hör ich jetzt auf herumzuraten. Javun, wenn du noch an Antworten interessiert bist, dann melde dich hier mal.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: