strcat scheint '\0' im ersten String nicht zu überschreiben

OP #1979764
Mein Problem wurde schon an anderer Stelle andiskutiert. Ich wurde 
jedoch gebeten, für einen solchen Fall einen neuen Thread aufzumachen:

Ich habe ein ganz ungewöhnliches Problem:
1
char pfad[1024];
2
char datei[1024];
3
FILE* stream;
4

5
fgets(pfad,sizeof(pfad),stdin); // Pfad eingeben:  pfad=="C:\\meinPfad"
6
fflush(stdin);
7
fgets(datei,sizeof(datei),stdin); // Dateinamen eingeben:  datei=="text.txt"
8
fflush(stdin);
9

10
strcat(pfad,datei);
11
stream=fopen(pfad,"r");

Diese letzte Zeile wird nicht ausgeführt, da schon davor bei strcat ein
falscher String entsteht.
Mein Debugger (GNU GCC Compiler) sagt, dass pfad nach strcat so
aussieht:pfad=="C:\\meinPfad\ntext.txt\n"d.h. dass er den ersten 
Nullterminator nicht überschrieben hat.

Ok, ich merke gerade, dass man nach "meinPfad" auch noch "\\" einfügen
müsste. Aber trotzdem hab ich noch das andere Problem.


Es hat auch schon jemand das Folgende geantwortet:
>Zu deinem Problem:
>fgets liest die ganze eingegebene Zeile, INCLUSIVE dem "Enter" am
>Zeilenende.

Aber ich sehe im Debugger, dass pfad den Wert "C:\\meinPfad\0......." 
hat. Die Punkte (........) stehen hier für irgendwas im Speicher. 
Erkennt strcat nun nicht das erste Nullbyte?
Gast
>pfad=="C:\\meinPfad\ntext.txt\n"

>d.h. dass er den ersten Nullterminator nicht überschrieben hat.

>Erkennt strcat nun nicht das erste Nullbyte?

Woraus genau schliesst Du das, er das erste Nullbyte ignoriert?
Gast
Hier mein Test-Program.
Eingabe:
abc<enter>
def<enter>

Ausgabe (|hexdump -C)
1
00000000  61 62 63 0a 64 65 66 0a  0a                       |abc.def..|
2
00000009

Soweit korrekt, ohne wilde NUL-Bytes.
Was passiert bei dir anderes?
Angehängte Dateien:
OP
Ohman, hab schon wieder den gleichen Fehler gemacht beim tippen:

Es soll heißen

pfad=="C:\\meinPfad\0text.txt\n"

Wieso steht also nach strcat immernoch ein \0 mitten drin?

EDIT: Ok, doch nicht. \n war schon richtig. Sorry mein Fehler. Ich 
glaube, jetzt ist es klar.
Dein Fehler ist immer noch derselbe:

fgets lässt das \n (das Enter welches du eingegeben hast) im String!
Und da du es nicht entfernst, bleibt es auch da drinnen.

Wenn du dir mal pfad und datei direkt nach der Eingabe ansehen würdest, 
würdest du das sehen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.