Klausuraufgabe
-
c++-user schrieb:
Ich rufe die Funktion auf:
strcpy(str,strcatTrenn("h","string",'*'));Wer hat dir denn gesagt, dass du das so machen sollst??
Nochmal: du willst etwas an einen String anhängen. Daher muss auch genügend Platz für diesen String bereitstehen. Du kannst also nicht einfach "h" (Stringliteral mit 2 Zeichen Länge) an deine Funktion übergeben. Du musst den String vorher erzeugen und dabei genug Speicher reservieren (ansonsten schreibst du ins Nirwana). Das machst du am einfachsten, indem du dich an mein strcpy-Beispiel auf Seite 2 hältst (ich verstehe nicht, warum du das ignorierst). Dein Code hier ist vollkommen sinnlos und zeigt, dass du leider nicht verstehst, was du da machst.
Kleiner Tipp: du brauchst die Rückgabe deiner Funktion nicht zu verwenden! Mach dich mal schlau, was eine Parameterübergabe per Wert (by-value) und per Referenz (by-reference) bedeutet. Wikipedia ist eine Möglichkeit.
-
Vielen Dank für die Hilfe, habs jetzt hinbekommen. Für die Klausur hätte mein bereits geposteter Kram sicher ein paar Punkte gebracht, wird ja alles schriftlich gemacht, hätt also meine Funktion nicht aufrufen müssen.
Danke nochmal
#include <iostream> using namespace std; char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; while(ziel[strlaenge]!='\0'){ strlaenge++; } while(ziel[strlaenge-1]==' '){ strlaenge--; } if(ziel[strlaenge]!=' '){ ziel[strlaenge]=' '; } strlaenge++; ziel[strlaenge]=trenn; strlaenge++; for(int i=0;quelle[i]!='\0';i++){ ziel[strlaenge]=quelle[i]; strlaenge++; } ziel[strlaenge]='\0'; return ziel; } int main () { char str[256]; strcpy(str,"h"); cout<<strcatTrenn(str,"string",'*'); return 0; }
-
Dein Code ist falsch wenn, der Eingabestring leer ist!
Bufferunderflow!
-
Tu mir (abgesehen von Martins Einwand) noch einen Gefallen und rücke die for-Schleife vernünftig (bzw. überhaupt) ein. Bei den restlichen Schleifen und Verzweigungen hast du es ja auch gemacht.
-
Ja in der Klausur kommt auch nicht so drauf an ob die Einrückung stimmt ist ja handschriftlich. Aber ansonsten haste recht.
-
@Martin Richter
Wenn der String Leer ist funktioniert es auch.
-
c++-user schrieb:
@Martin Richter
Wenn der String Leer ist funktioniert es auch.Nein! Wenn der String leer ist, bleibt strlaenge auf 0 und du fragst in der 2. while-Schleife ziel[0-1] ab. Das ist logischerweise außerhalb des gültigen Bereichs...
-
Stimmt, hat den Compiler aber nicht gestört. Vll ists ja so richtig:
char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=1; while(ziel[strlaenge]!='\0'){ strlaenge++; } strlaenge--; //Da Zählung von 0 while(ziel[strlaenge]==' '){ strlaenge--; } if(ziel[strlaenge+1]!=' '){ ziel[strlaenge+1]=' '; } strlaenge++; ziel[strlaenge+1]=trenn; strlaenge++; for(int i=0;quelle[i]!='\0';i++){ ziel[strlaenge+1]=quelle[i]; strlaenge++; } ziel[strlaenge+1]='\0'; return ziel; }
-
Nein! Mit raten wirst Du nicht hinkommen. Wenn jetzt der Stringleer ist, läuft die erste Schleife über das Ende hinaus.
-
Du hast ordentlich verschlimmbessert...
Hör mal, bevor du jetzt immer weiter rätst, solltest du einfach mal versuchen, den Ablauf zu verstehen. Nutze den Debugger, gehe schrittweise durch das Programm und sieh dir die Werte an und welche Auswirkungen sie haben. Sobald du verstehst, was dein Code macht, wirst du ganz leicht die letzten Fehler beheben können. Aber so, wie du es im Moment machst, hat es einfach keinen Sinn. Ich habe auch nicht den Eindruck, dass du dich wirklich mit dem Code beschäftigst. Es scheint eher so zu sein, dass du jedesmal nach einem neuen Hinweis hier eine Minute auf den Code starrst und dann einfach irgendwas änderst, was dir gerade in den Sinn kommt. Und du testest dein Programm irgendwie gar nicht. Sonst hättest du doch sicher hin und wieder bemerkt, dass etwas nicht in Ordnung ist.