mikrocontroller.net

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


Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht 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:
char pfad[1024];
char datei[1024];
FILE* stream;

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

strcat(pfad,datei);
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?

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Schorsch (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mein Test-Program.
Eingabe:
abc<enter>
def<enter>

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

Soweit korrekt, ohne wilde NUL-Bytes.
Was passiert bei dir anderes?

Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Huch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deswegen auch der Rat: Nie abtippen. Immer Copy&Paste.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M. B. (manubaum) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Schorsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: DirkB (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.