[Gelöst]Stringverkettung Problem
-
Guten Abend alle zusammen.
Ich hab einen Fehler in meinem Quellcode.
Problem: Es werden immer alle Zeichen miteinander verkettet, die zudem auch noch nicht in einer Zeile stehen.
Würde mich über eine Antwort/Hinweis freuen.#include <stdio.h> #include <string.h> int main(){ char textA[100]; char textB[100]; char wahl; int x; printf("TextA="); fgets(textA, 100, stdin); printf("TextB="); fgets(textB, 100, stdin); printf("Möchten Sie alle Zeichen von TextB an TextA anhängen?\n"); printf("j/n ? ="); scanf("%c", &wahl); //Alles anhängen if(wahl == 'j' || 'J'){ strcat(textA, textB); printf("%s", textA); } // n Zeichen anhängen else if(wahl == 'n' || 'N'){ printf("Wie viele Zeichen sollen angehängt werden? ="); scanf("%d", &x); strncat(textA, textB, x); printf("%s", textA); } }
-
if(wahl == 'j' || 'J'){
Wer hat Dir das beigebracht? Erschlage sie oder ihn. Das ergibt nämlich immer true. So ist es richtig:
if(wahl == 'j' || wahl == 'J'){
mfg Martin
-
wahl == 'j' || 'J'
entspricht((wahl == 'j') || 'J')
. Selbst wenn es(wahl == ('j' || 'J'))
entspräche (was es nicht tut), wäre dies nicht das, was du suchst. Bekommst du mit dieser Information selber einen passenden Ausdruck dafür hin, dass wahl gleich 'j' oder wahl gleich 'J' sein soll?edit: Zu langsam.
-
textA kann insgesammt nur 99 Zeichen aufnehmen.
Die Größe wird nicht verändert durch das strcat.Um sicher zu gehen solltest du textA auf 200 Zeichen vergrößern (bei fgets bleibt es aber bei 100).
-
danke für die Antworten.
Jaa, stimmt, hierdurch geht die Bediengung auf: if(wahl == 'j' || wahl == 'J'){
Ist es auch möglich diesen "schönheitsmangel" zu beseitigen, dass beide Texte zum Schluss in einer Zeile stehen?
Wenn ichs durchlaufen lasse, sieht es so aus:
-
fgets liest den zeilenumbruch mit ein, den musste vorm verketten entfernen.
-
ok, danke, habs.
Hätte anstatt fgets(textA, 100, stdin); , gets(textA); benutzen sollen.
-
KFF7 schrieb:
ok, danke, habs.
Hätte anstatt fgets(textA, 100, stdin); , gets(textA); benutzen sollen.Nein, Nein, NEIN.
Bei gets kannst du nicht angeben wie viel Platz in textA ist.
Da kannst du auch 100000 Zeichen eingeben.So enstehen Bufferoverflows.
Gar nicht erst mit anfangen.
-
Hmm,ok, wie sollte/könnte ich denn dann vorgehen,um auf der sicheren Seite zu sein? Ich möchte zum Schluss wie oben erwähnt den zeilenumbruch wegbekommen.
-
Du kannst LF z.B. durch NUL ersetzen:
printf("TextA="); fgets(textA, 100, stdin); char *c = strchr(textA, '\n'); if (c) { *c = '\0'; }
-
Klasse! Danke, gute Idee. Auch schön nachvollziehbar für mich als Anfänger
-
EinGast schrieb:
Du kannst LF z.B. durch NUL ersetzen:
printf("TextA="); fgets(textA, 100, stdin); char *c = strchr(textA, '\n'); if (c) { *c = '\0'; }
Einfacher, wenn auch implementierungsabhängig:
strtok(textA,"\n");