Klausuraufgabe
-
Zur Klausurvorbereitung versuche ich mich gerade an einer alten Klausur:
http://img199.imageshack.us/img199/949/aufgabe.jpgAls Code hab ich mir nun folgendes überlegt:
char *strcatTrenn(char *ziel,const char*quelle,char trenn){ if(ziel[strlen(ziel)]!='/0'){ ziel[strlen(ziel)+1]='/0'; ziel[strlen(ziel)+2]=trenn; } for(int i=0;quelle[i]=='/0';i++){ ziel[strlen(ziel)+2+i]=quelle[i]; } return ziel; }Macht das Sinn? Würde das funktionieren?
-
Hast du es denn ausprobiert? Das wäre ja mal das erste, was du machen solltest.
Übrigens meinst du sicher '****0'...
EDIT: Und das hier z.B.
if(ziel[strlen(ziel)]!='/0')macht wenig Sinn, denke ich. strlen bestimmt die Länge ja anhand der terminierenden Null, also ist diese Bedingung nie wahr (ziel[strlen(ziel)] ist immer '\0').
EDIT: Ähm, und ich habe mir gerade mal die Aufgabenstellung durchgelesen. Du scheinst du denken, dass '\0' ein Leerzeichen ist. Das ist natürlich falsch, ein Leerzeichen ist ' ' oder ASCII 32.
P.S.: Mit MFC hat das wenig zu tun. Und mit C++ auch nicht. Das gehört eher ins C-Forum.
-
Der letzte Punkt der Aufgabenstellung scheint auch die Benutzung von strlen zu verbieten!!
-
Und wenn wir mal davon ausgehen, dass die erste Bedingung korrekt umgesetzt ist (eventuell Leerzeichen anfügen), dann musst du auch eine neue Länge speichern...
Ich würde vorschlagen, mach dich erst mal daran, die Länge des übergebenen Strings zu ermitteln (also ein strlen-Ersatz). Dann sehen wir weiter.
-
Danke für die Hilfe.
Ich hab jetzt strlen ersetzt:[code]
char *strcatTrenn(char *ziel,const char*quelle,char trenn){
int strlaenge=0;
while(ziel[strlaenge]!='\0')
{
strlaenge++;
}if(ziel[strlaenge]!=''){
ziel[strlaenge+1]='';
ziel[strlaenge+2]=trenn;
}for(int i=0;quelle[i]=='\0';i++){
ziel[strlaenge+2+i]=quelle[i];
}return ziel;
}
-
Danke für die Hilfe.
Ich hab jetzt strlen ersetzt:char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; while(ziel[strlaenge]!='\0') { strlaenge++; } if(ziel[strlaenge]!=''){ ziel[strlaenge+1]=''; ziel[strlaenge+2]=trenn; } for(int i=0;quelle[i]=='\0';i++){ ziel[strlaenge+2+i]=quelle[i]; } return ziel; }
-
Leerzeichen ist
' 'und nicht''. Am Schluss sollte der String auch wieder ein '\0' hinten haben. Und du hast noch einen weiteren kleinen Fehler drin.
-
Nimm [cpp] statt [code], dann sieht das auch schöner aus.
EDIT: Du berücksichtigst den Fall 'kein Leerzeichen am Ende des Eingabestrings' nicht. Da musst du auch das Trennzeichen anfügen. Und wenn du ein Leerzeichen anhängst, ändern sich die Länge, wie gesagt...
-
Ok,muss ich bei der for Schleife +3 anstatt +2 nehmen? Ansonsten würde im ersten Durchgang ja mein Trennzeichen überschrieben werden:
char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; int komplettStrLaenge=0; while(ziel[strlaenge]!='\0') { strlaenge++; } if(ziel[strlaenge]!=' '){ ziel[strlaenge+1]=' '; ziel[strlaenge+2]=trenn; } for(int i=0;quelle[i]=='\0';i++){ ziel[strlaenge+3+i]=quelle[i]; } komplettStrLaenge=strlaenge+3+i; ziel[komplettStrLaenge+1]='\0'; return ziel; }
-
Sorry für Doppelpost, werd mich bei der nächsten frage wohl vorher registrieren um editieren zu können.
Ok,muss ich bei der for Schleife +3 anstatt +2 nehmen? Ansonsten würde im ersten Durchgang ja mein Trennzeichen überschrieben werden:
char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; int komplettStrLaenge=0; while(ziel[strlaenge]!='\0') { strlaenge++; } if(ziel[strlaenge]!=' '){ ziel[strlaenge+1]=' '; ziel[strlaenge+2]=trenn; } for(int i=0;quelle[i]=='\0';i++){ ziel[strlaenge+3+i]=quelle[i]; } komplettStrLaenge=strlaenge+3+i; ziel[komplettStrLaenge+1]='\0'; return ziel; }
-
Du musst erst ermitteln, ob am Ende ein Leerzeichen ist. Abhängig davon hängst du eins an oder nicht. Hierbei ermittlest du die neue Länge (ist ja eventuell um eins größer geworden). Und das Trennzeichen musst du in jedem Fall anhängen, auch wenn im Ursprungsstring kein Leerzeichen am Ende war (denn das machst du im Moment nicht). Die Position für das Trennzeichen hängt von der neuen Länge ab (wie auch die Folgeschritte).
-
Hab nochmal deinen Vorschlag mit eingebracht:
char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; while(ziel[strlaenge]!='\0') { 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+1]='\0'; return ziel; }
-
Und, klappt jetzt alles?
-
_matze schrieb:
Und, klappt jetzt alles?
Nö! Sieht man doch...

-
Martin Richter schrieb:
_matze schrieb:
Und, klappt jetzt alles?
Nö! Sieht man doch...

Hehe, ich hatte keinen Bock, mir das alles wieder anzusehen. Er sollte eigentlich mal so vorgehen, dass er sein Programm ausprobiert und dann die Fehler postet, anstatt den Code zur allgemeinen Überprüfung bereitzustellen...
-
Ok, habs nun mal in XCode probiert. Fehler gibt er mir keine aus, allerdings auch keine Ausgabe:
#include <iostream> #include <iostream> using namespace std; char *strcatTrenn(char *ziel,const char*quelle,char trenn){ int strlaenge=0; while(ziel[strlaenge]!='\0') { 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+1]='\0'; return ziel; } int main () { cout << strcatTrenn("test","string",'*'); return 0; }
-
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++; }