003
04.11.2007, 19:45 Uhr
0xdeadbeef
Gott (Operator)
|
Oh Junge...wer hat dir den sowas beigebracht...
Aaaalso, erstmal die offensichtlichen Dinge:
- <stdlib> ist kein header, das muss wenn, dann <cstdlib> heißen. - <conio> ist ein hier äußerst unnötiger Nicht-Standardheader (Nimm statt getch() einfach std::cin.get()) - main ist immer int. Schreib int main(), per default gibt main (aber auch nur main!) 0 zurück. - Symbole aus Standardheadern sind im Namensraum std. std::cout, std::cin, std::endl, std::string etc. Ich empfehle ernsthaft, das auszuschreiben, aber wenn's dir partout zu viel Tipparbeit ist, schreib "using namespace std;" An den Anfang deiner main-Funktion.
Die im echten Leben sinnvolle Variante wär hier natürlich, std::string zu benutzen, also
C++: |
#include <iostream> #include <string>
int main() { std::string s = "Aber";
s += " hurtig";
std::cout << s << std::endl; }
|
...aber hier geht es wohl um eine Zeigerübung. Ich werd dir nicht die gesamte Lösung vorkauen, aber hier ein paar Tipps:
1. Wenn du etwas mit new[] anlegst, musst du es auch mit delete[] wieder freigeben 2. Eine lokale Variable zu verändern, ändert die außerhalb übergebene Variable nicht - &s1 in main in deinem Beispiel wird nach Ablauf der str_add-Funktion immer noch das gleiche sein. Aber Du kannst an die Entsprechende Stelle im Speicher schreiben und damit s1 verändern. Vergleiche zum Beispiel
C++: |
void quadratieren_nach_altem_c_stil(int *x) { *x *= *x; }
|
3. Bevor du den Speicher anforderst, musst du herausfinden, wie viel Speicher du eigentlich brauchst - also die Länge der beiden Strings plus Sentinel. Erst dann kannst du per new die angemessene Speicherlänge alloziieren. Vergiss dabei nicht, den alten Speicher freizugeben (siehe 1) 4. std::strcpy aus dem Header <cstring> ist dein Freund. In deinem Beispiel vergisst du den sentinel, die alten Funktionen da übernehmen das für dich. 5. Diese Funktion kann in der Form eigentlich nur funktionieren, wenn du von vorneherein als ersten Parameter einen Zeiger auf einen mit new[] angeforderten Speicherbereich, oder einen Zeiger auf einen Zeiger auf NULL übergibst, sonst kriegst du entweder Speicherlöcher oder falsche delete[]s.
Nachtrag:
C++: |
tmp = new char[100];
|
ist nicht dynamisch. 100 war das letzte mal, als ich gekuckt habe, eine Konstante. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 04.11.2007 um 19:49 Uhr von 0xdeadbeef editiert. |