Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
30.12.2003, 23:15
Ready



Hallo zusammen,

ich lerne zu Zeit ein wenig c++ mit Hilfe des Buches : "C++ Einführung und professionelle Programmierung 6. Auflage" von Ulrich Breymann.

Als eine Übungsaufgabe soll ich eine Funktion schreiben, die den Inhalt eines Strings in einen anderen kopiert, wobei vorgegeben ist das der Ziel-String genug platz hat.

Ich war mir eigentlich ziemlich sicher wie ich die Funktion schreibe und das ist dabei herausgekommen :

Quellcode:#include <iostream>

using namespace std;

void strcpy2(char *ziel,const char *quelle)
{
  while(*ziel++ = *quelle++);
}


int main()
{
  char* string1 = "Hallo, wie gehts?";
  char* string2 = "Mir gehts echt gut!";

  cout << "string1 vor dem Vertauschen: " << string1 << endl;
  cout << "string2 vor dem Vertauschen: " << string2 << endl;
  
  strcpy2(string2,string1);

  cout << "string1 nach dem Vertauschen: " << string1 << endl;
  cout << "string2 nach dem Vertauschen: " << string2 << endl;

  return 0;


}
Nun habe ich das Programm kompiliert und gelinkt ohne jeden Fehler, wenn ich es allerdings ausführe erhalte ich einen Ausnahmefehler nach der 2. Ausgabe, also zu begin der Funktion. Deshalt habe ich in die beiligende Lösung geguckt ob ich etwas falsch gemacht habe, dort war die Funktion allerdings genau so aufgebaut! Was mache ich falsch ?

MfG Ready

--


Dieser Beitrag wurde am 30.12.2003 um 23:16 von Ready bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
001
30.12.2003, 23:45
KillerDoc



Naja 1. vertauscht die funktion die Strings nicht, sondern kopiert nur den 2. auf den 1. Aber egal das is ja nicht das Problem.

Das Problem warum das nicht geht ist das du nicht auf string2 schreiben darfst da string2 auf dem Stack liegt. Damit die Funktion dorthin schreiben kann müsstest du den Speicher mittels malloc bzw new im Heap reservieren.

Das machst du folgendermaßen:

char *string2 = (char *)malloc(512); //statt 512 halt wieviel bytes(zeichen) an speicher du brauchst.
sprintf(string2,"Mir gehts echt gut!");

statt

char* string2 = "Mir gehts echt gut!";

Dann sollts gehn.

Am Schluss (zb vor return 0;) nicht vergessen den reservierten Speicher wieder freizugeben mittels

free(string2);

Weiß aber nicht ob dir das so viel hilft wenn ich das so schreibe. Wurde das in dem Buch noch nicht behandelt?

--

lazy sunday afternooon
i got no mind to worry
i close my eyes and drift away....

zum Seitenanfang zum Seitenende Profil || Suche
002
30.12.2003, 23:52
Ready



Jetzt verstehe ich : Ich muss den Speicher für die Strings im Heap erzeugen, auf den die Zeiger dann später zeigen. Oder hab ich das jetzt falsch verstanden ?

Das bedeutet doch eigentlich wenn ich jetzt eine Referenz des Zeigers übergeben würde sprich :

Quellcode:void strcpy2(char& *ziel,const char& *quelle)Würde es funktionieren oder habe ich jetzt schwachsin geschrieben ?

--


Dieser Beitrag wurde am 30.12.2003 um 23:53 von Ready bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
003
31.12.2003, 00:02
KillerDoc



Naja wenn du den Speicher für die Strings im Heap reservierst und die Zeiger darauf zeigen lässt sollte es sowieso kein Problem mehr geben.

Ob du die Zeiger jetzt per Referenz oder per Wert übergibst ist egal. Wenn per Referenz allerdings char* &ziel und nicht char& *ziel...
Am besten du übergibst einfach per Wert..

--

lazy sunday afternooon
i got no mind to worry
i close my eyes and drift away....

zum Seitenanfang zum Seitenende Profil || Suche
004
31.12.2003, 00:23
CN



oder du machst
Quellcode:char string1[] = "Hallo, wie gehts?";
char string2[] = "Mir gehts echt gut!";

--


Dieser Beitrag wurde am 31.12.2003 um 00:23 von CN bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche
005
31.12.2003, 03:10
Leviathan



Die Art der Übergabe ist hier überhaupt nicht das Problem, die ist so am Besten, wie sie im ersten Post steht.

Das Problem ist, dass mitQuellcode:char* string1 = "Hallo, wie gehts?";für string1 kein Speicher alloziert wird, deshalb liest/schreibt die Kopierfunktion vom/ins Leere.
CNs Code sollte das beheben.

--

Entities: HL | HL²
Kompilierfehler
r_speeds | mehr über r_speeds

zum Seitenanfang zum Seitenende Profil || Suche
006
31.12.2003, 03:50
KillerDoc



Naja das die Funktion vom/ins leere liest/schreibt stimmt nicht...

char *string1 = "Hallo, wie gehts?";

erzeugt den zeiger string1 auf dem stack und setzt ihn auf den String "Hallo, wie gehts?". Das Problem ist das der String in dem Fall an einer Stelle gespeichert ist, an die man keinen Schreibzugriff hat. Lesen geht aber auf jeden Fall. Und nachdem string1 hier eh nur gelesen wird gibts da kein Problem.

Wenn man Schreib Zugriff auf den den Speicher braucht lässt sich das entweder eben durch malloc/new lösen, indem man den Speicher im Heap anfordert, oder so wie CN zeigt indem man keinen char Zeiger sondern ein char Array erstellt, weil dann der ganze String am Stack landet und ned nur der Zeiger.

--

lazy sunday afternooon
i got no mind to worry
i close my eyes and drift away....

zum Seitenanfang zum Seitenende Profil || Suche
007
31.12.2003, 10:24
Ready



Danke erstmal für die vielen antworten :)
Ich habe das Problem jetzt so gelöst das ich den Speicher für die Strings im Heap erzeugt habe, damit ging es ohne Probleme.

--

zum Seitenanfang zum Seitenende Profil || Suche
008
01.01.2004, 01:15
theDon



/e: whargs, stimmt ja garnicht.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before


Dieser Beitrag wurde am 01.01.2004 um 01:15 von theDon bearbeitet.
zum Seitenanfang zum Seitenende Profil || Suche