string erweitern in for-Schleife
-
In der Schule mussten wir heute eingene Funktionen für die Funktionen strlen, strcat und strcmp aus der string.h schreiben.
Mit strcat haperts jetzt bei mir.
Nun, das Prinzip ist, ich lese 2 strings ein (Text1 und Text2) und erweitere den char-Array Text1 mit den Zeichen von Text2. So weit, so gut.
In der for-Schleife, die sich dann in der Funktion befindet macht er dann auch alles fleißig, wenn ichs mit printf`s überprüfe. Das was raus kommt ist der char-Array Text1 mit leider nur dem ersten Zeichen aus Text2 erweitert#include<stdio.h> #include<string.h> void scat(char[],char[]); int main(){ char Text1[100]; char Text2[100]; printf("Bitte Text1 eingeben\n"); scanf("%[^'\n']",Text1); //Leerzeichen liest er nicht ein. Dann ist es möglich auch mehrere Wörter einzugeben getchar(); printf("Bitte Text2 eingeben\n"); scanf("%[^'\n']",Text2); scat(Text1,Text2); printf("%s\n",Text1); return 0;} void scat(char T1[],char T2[]){ int i; for(i=0;T2[i]!='\0';i++) T1[i+strlen(T1)]=T2[i];} //das Arrayende soll mit Text2 überschrieben werden
kann mir wer helfen ?
-
Du solltest niemals das sehr teure strlen in einer Schleife aufrufen.
strlen ist auch hier das Problem, jedoch aus einem anderen Grund: Sobald du das letzte Zeichen von Text1 überschrieben hast (also das beendende Nullzeichen) kann strlen nicht mehr auf Text1 angewendet werden. strlen sucht schließlich nach dem ersten Nullzeichen, welches du soeben überschrieben hast! Das heißt, strlen geht einfach weiter durch den Arbeitsspeicher, bis es irgendwo zufällig auf eine 0 trifft und gibt dann einen völlig falschen Wert zurück.
A propos Nullterminierung: Deine scat-Funktion würde derzeit (selbst wenn das mit dem strlen richtig wäre) den Text nicht mit einem Nullzeichen abschließen.
Reicht das an Ratschlägen? Ich möchte dir nicht die Hausaufgaben vormachen (die sind schließlich für dich zur Übung), daher gibt es keine Komplettlösung.
P.S.: Falls du es noch nicht getan hast, würde ich mit dem eigenen strlen anfangen. Dann wird dir auch klarer, wieso das strlen hier Probleme macht und wieso strlen so eine teure Funktion ist.
-
Warum willst du eigentlich die ' nicht mit einlesen?
Und wenn dann reicht auch eins davon in der Scanlist.Die '' brauchst du nur, wenn du einzelne Zeichen hast.
Bei scanf steht das aber schon im Formatstring.
-
logisch, \0 wird ja überschrieben, also ist strlen dann sinnlos.
Lösung:
int nummerT1 =strlen(T1); for(i=0;T2[i]!='\0';i++) T1[i+nummerT1]=T2[i];}
scanf:
ja, die ' in scanf sind quatsch
aus:scanf("%[^'\n']",Text1); scanf("%[^'\n']",Text2);
wird:
scanf("%[^\n]",Text1); scanf("%[^\n]",Text2);
Danke!
-
Es fehlt immer noch die abschließende '\0' beim neuen T1.
-
DirkB schrieb:
Es fehlt immer noch die abschließende '\0' beim neuen T1.
Stimmt, die Schleife muss noch ein Mal:
int nummerT1=strlen(T1); int nummerT2=strlen(T2); for(i=0;T2[i]!=nummerT2;i++) T1[i+nummerT1]=T2[i];}
-
Passt immer noch nicht. strlen zählt die Nullterminierung nicht mit. Das heißt deine Schleife kopiert ein Zeichen zu wenig.
-
Nö.
i hat am Ende der Schleife ja schon den richtigen Wert.T1[i+nummerT1] = '\0';
nach der Schleife reicht.
-
DirkB schrieb:
T1[i+nummerT1] = '\0';
nach der Schleife reicht.
Klar reicht das. Aber es fehlt!
-
Sorry, das "Nö" galt Superstar. Ich wurde beim schreiben der Antwort aufgehalten und hatte dein Post nicht gesehen.
-
DirkB schrieb:
Sorry, das "Nö" galt Superstar.
Auweja, jetzt hat man es hier auch schon mit superstarren zu tun.
Drama, baby.
-
EOP schrieb:
superstarren
das bin ich :p
DirkB schrieb:
T1[i+nummerT1] = '\0';
nach der Schleife reicht.
hab ich berücksichtigt, danke
ein weiteres kleines Problem hab ich jetzt leider wieder. Der Code nochmal, so wie er jetzt aussieht:
qheader.h:
#include<stdio.h> int slength(char a[]){ int i; for(i=0;a[i]!='\0';i++); return i;} void scat(char a[],char b[]){ int i=0; int nummerT1=slength(a); int nummerT2=slength(b); for(i=0;b[i]!=nummerT2;i++) a[i+nummerT1]=b[i]; a[i+nummerT1] = '\0'; } int scmp(char a[],char b[]){ int i; if(slength(a)!=slength(b)) return 0; else { for(i=0;a[i]!='\0';i++) { if(a[i]!=b[i]) {return 0; break;} } } return 1;}
Ausgabe.c:
#include<stdio.h> #include</home/sex/Documents/C:/qheader.h> #include<string.h> int main(){ char Text1[100]; char Text2[100]; printf("Bitte Text1 eingeben\n"); scanf("%[^\n]",Text1); getchar(); printf("Bitte Text2 eingeben\n"); scanf("%[^\n]",Text2); scat(Text1,Text2); printf("%s\n",Text1); printf("Die Zeichenlaenge von Text1 ist: %d\n",slength(Text1)); return 0;}
Der Code ist gleicher wie vorher, ist aber halt nur die unformatierte und schwerer lesbare Form mit einer "quasi-header" und den Ersatz von strlen mit meiner slength-Funktion. (Ich habs auch mit strlen ausprobiert und der Fehler verschwand nicht.)Das Programm tut selbiges wie vorher, nur will ich danach die Zeichenlänge für den zusammengefügten Text1-String bestimmen.
printf("Die Zeichenlaenge von Text1 ist: %d\n",slength(Text1));
Das Programm gibt zwar den richtigen, zusammengefügten Text1-String aus und dann die richtige Zeichenlänge, jedoch ist in der dritten Ausgabezeile noch ein "Speicherzugriffsfehler". Das soll nicht erscheinen.
-
Die Bedingung in deiner for-Schleife. Guck die dir nochmal ganz genau an.
P.S.: Darf ich dir einen anderen Einrückungsstil nahelegen? Es ist ungeheuer schwer zu lesen, wo bei dir ein Codeblock anfängt oder aufhört.