Forum: PC-Programmierung strcat scheint '\0' im ersten String nicht zu überschreiben


von Mark M. (mom-jovi)


Lesenswert?

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?

von Huch (Gast)


Lesenswert?

>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?

von Schorsch (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Mark M. (mom-jovi)


Lesenswert?

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.

von Huch (Gast)


Lesenswert?

Deswegen auch der Rat: Nie abtippen. Immer Copy&Paste.

von Karl H. (kbuchegg)


Lesenswert?

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.

von M. B. (manubaum) Benutzerseite


Lesenswert?


von Schorsch (Gast)


Lesenswert?

M. B. schrieb:
> esape alles!!!
>
> http://de.wikipedia.org/wiki/Escape-Sequenz#Escape...

Was soll das jetzt?

Er hat keine einzige String-Konstante in seinem Codeschnippsel, folglich 
auch nichts, wo ein Escape auch nur ansatzweise möglich/gültig/sinnvoll 
wäre.

von DirkB (Gast)


Lesenswert?

Aber der Debugger zeigt nicht druckbare Zeichen halt als 
C-Escapesequenzen an: '\\' oder '\n '

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.