Klausuraufgabe
-
So darfst du das sowieso nicht aufrufen! Du musst schon ein char-Array (kein Literal) mit genügend Platz definieren. Zum Beispiel so:
char str[256]; strcpy(str,"test");
-
Ich bin zu blöd...
int main () { char str[256]; str=strcatTrenn("test ","string",'-'); cout << str; return 0; }führt zu
incompatible types .. of char* to char[256]
-
Dein Code hängt immer ein Leerzeichen an! Auch wenn bereits eines am Ende steht!
-
Echt? Dieser Code hängt doch nur eins an wenn am Ende kein Leerzeichen steht:
if(ziel[strlaenge]!=' '){ ziel[strlaenge]=' '; strlaenge++; }
-
c++-user schrieb:
int main () { char str[256]; str=strcatTrenn("test ","string",'-'); cout << str; return 0; }Du sollst ein char-Array anlegen (hast du) und dann den String deiner Wahl hineinkopieren (hast du nicht). Ich habe es doch schon vorgemacht, nimm strcpy. Und dann übergibst du str an deine Funktion...
-
c++-user schrieb:
Echt? Dieser Code hängt doch nur eins an wenn am Ende kein Leerzeichen steht:
if(ziel[strlaenge]!=' '){ ziel[strlaenge]=' '; strlaenge++; }Sorry, aber hast du deinen Code auch mal richtig durchdacht? Wenn dein String "H " ('H', ' ' und '\0') ist, dann ist strlaenge=2. Du vergleichst hier also ziel[2]==' '. Und was ist ziel[2], hm? Kleiner (bzw. riesengroßer) Tipp: der Index fängt bei 0 an.
-
Das Problem ist ja das ich keine Bibliothelsfunktionen wie z.b. strcpy verwenden darf.
Zu deiner zweiten Anmerkung:
strlaenge wird ja in einer while Schleife ermittelt und wenn ich das mit deinem Beispiel "H " durchspiele müsste als Wert 1 rauskommen.Und ziel[2]=' ' ist ja eine Zuweisung und kein Vergleich.Oder habe ich dich falsch verstanden?
Danke
-
c++-user schrieb:
Das Problem ist ja das ich keine Bibliothelsfunktionen wie z.b. strcpy verwenden darf.
Du darfst strcpy nicht in deiner Funktion benutzen, aber außerhalb ist das schon in Ordnung (es geht ja nur darum, eine Umgebung zu schaffen, in der du deine Funktion ausführen und testen kannst).
c++-user schrieb:
strlaenge wird ja in einer while Schleife ermittelt und wenn ich das mit deinem Beispiel "H " durchspiele müsste als Wert 1 rauskommen.Und ziel[2]=' ' ist ja eine Zuweisung und kein Vergleich.
Da hast du dich wohl verzählt.
Durchgang 1: strlaenge ist 0 und du zeigst auf 'H'.
Durchgang 2: strlaenge ist 1 und du zeigst auf ' '.
Durchgang 3: strlaenge ist 2 und du zeigst auf '\0', die Schleife wird abgebrochen.strlaenge ist also 2. Und dann vergleichst du:
if(ziel[strlaenge]!=' '){ //ziel[2] ist '\0' und ungleich ' ', also ist der Vergleich war ziel[strlaenge]=' '; //du überschreibst '\0' (ziel[2]) mit ' ' strlaenge++; }Alles klar?
-
Ich versteh deine Punkte, kann das aber nicht wirklich in neuen Code umsetzten

-
c++-user schrieb:
Ich versteh deine Punkte, kann das aber nicht wirklich in neuen Code umsetzten

1. strcpy kannst du so (in deiner main-Funktion) benutzen, wie von mir im Beispiel gezeigt.
2. Beim Anfügen eines Leerzeichens (und auch bei den folgenden Schritten, wie z.B. Anhängen des Trennzeichens) nimmst du nicht strlaenge als Array-Index, sondern strlaenge-1. Eine Ausnahme sollte hier strlange==0 sein, aber ignoriere das erst mal.
Jetzt solltest du aber weiterkommen, oder? Schließlich habe ich mit dem Zaunpfahl, ja sogar mit dem ganzen Zaun gewunken!

-
Hab mal wieder angepasst, aus irgend einen Grund hängt der in folgender Zeile:
char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; while(ziel[strlaenge]!='\0') { strlaenge++; } if(ziel[strlaenge-1]!=' '){ ziel[strlaenge-1]=' '; strlaenge++; } ziel[strlaenge-1]=trenn; //Mit dieser Zeile hängt der Compiler strlaenge++; cout<<strlaenge; for(int i=0;quelle[i]=='\0';i++){ ziel[strlaenge-1]=quelle[i]; strlaenge++; } ziel[strlaenge]='\0'; return ziel; }
-
'Der Compiler hängt' ist keine Fehlerbeschreibung!
Also poste den Fehlertext. Übrigens sieht die Zeile unverdächtig aus. Hast du vielleicht eher einen Laufzeitfehler statt eines Compiler-Fehlers?
EDIT: Und arbeite doch mal an deiner Einrückung, die ist echt grauenhaft...
http://de.wikipedia.org/wiki/EinrückungsstilEDIT2: Und übrigens ist die Bedingung deiner for-Schleife ziemlich sinnfrei. Schau dir doch bitte mal an, wie eine for-Schleife funktioniert.
-
könnte so gehen (ungetestet)
char *my_special_strcat (char *d, char *s, char c) { char *ret = d; // rückgabewert speichern while (*d) // ende finden d++; if (d[-1] != ' ') // wenn nicht space -> space *d++ = ' '; *d++ = c; // trennzeichen dran while (*s) // den rest anhaengen *d++ = *s++; return ret; // altes 'd' zurückgeben }
-
Super fricky, so lernt er bestimmt was dabei...

-
_matze schrieb:
Super fricky, so lernt er bestimmt was dabei...
keine angst, mein vorschlag tut vielleicht nicht genau das, was er will. und wenn er sich damit auseinandersetzt, lernt er nebenbei doch was.

-
if(ziel[strlaenge-1]!=' '){ ziel[strlaenge-1]=' '; strlaenge++; }Bin nicht sicher, daß Du da triffst. Vielleicht eher
if(ziel[strlaenge-1]!=' '){ ziel[strlaenge]=' '; strlaenge++; }ziel[strlaenge-1]=trenn; //Mit dieser Zeile hängt der Compiler strlaenge++; cout<<strlaenge;Das cout<< da geht gar nicht. Es will ausgeben bis zum '\0', aber Du hast noch keins geschrieben, um den String abzuschließen.
for(int i=0;quelle[i]=='\0';i++){ }Solange quelle[i] gleich '\0' ist?
Nee, grad falschrum. In C++ gibt es keine Abbruchbedingungen, sondern nur Laufbedingungen.
-
;fricky schrieb:
_matze schrieb:
Super fricky, so lernt er bestimmt was dabei...
keine angst, mein vorschlag tut vielleicht nicht genau das, was er will. und wenn er sich damit auseinandersetzt, lernt er nebenbei doch was.

Na ich bezweifle, dass er das Zeiger-inkrementieren überhaupt kennt (und somit versteht). Er ist sicher besser mit seiner Zähler-Variante bedient. Aber einen (für ihn fiesen) Stolperstein hast du wirklich dringelassen.

-
_matze schrieb:
Aber einen (für ihn fiesen) Stolperstein hast du wirklich dringelassen.

Der kam sicher beim Zurückfrickeln von
while (*d++ = *s++);// den rest anhaengen
-
_matze schrieb:
Na ich bezweifle, dass er das Zeiger-inkrementieren überhaupt kennt (und somit versteht). Er ist sicher besser mit seiner Zähler-Variante bedient.
ach mist. egal, kann ja nicht verkehrt sein, sich sowas auch mal anzugucken. eine musterlösung für seine hausaufgabe wollt ich nun auch garnicht posten.
_matze schrieb:
Aber einen (für ihn fiesen) Stolperstein hast du wirklich dringelassen.
ja, da fehlt noch was.

-
Das Problem ist er gibt mir nicht wirklich einen Fehler im Code aus. Der Code von ;fricky verhält sich allerdings genau wie meiner, es kommt also auch zu keiner Ausgabe.
Was der Compiler mir anzeigt ist:
The Debugger has exited due to signal 10 (SIGBUS).The Debugger has exited due to signal 10 (SIGBUS).