2017-11-06 4 views
-1

Ich bin sehr neu in C und arbeite an einem Dienstprogramm, das Ordner nach doppelten Dateien durchsucht und dann einige Dinge für sie tut. Wenn ich die Liste der doppelten Dateinamen habe, muss ich eine Zeichenfolge mit dem vollständigen Pfad und dem Dateinamen erstellen, um die Dateien zu bearbeiten, aber ich erhalte jedes Mal einen Fehler, wenn ich versuche, einen \ an den Pfad anzufügen, aber der Fehler nicht wenn ich das überspringe. Hier ist eine vereinfachte Version des Problems Code:Erstellen eines Pfades aus Zeichenfolgen in C

char *TARGET1 = "."; 
char *TARGET2 = ".\\test"; 
char *PATH_SEP = '\\'; 

char *folder1_files[filecount1]; // These arrays are populated with file 
char *folder2_files[filecount2]; // names elswhere in the code 
int l = 0; // The counter for the loop that is comparing the filenames 

char buffer[1024]; 
strcpy(buffer, TARGET2); 
printf("Building the path now...\n"); 
//strcat(buffer, PATH_SEP); 
strcat(buffer, folder2_files[l]); 
printf("Path: %s\n", buffer); 

Wenn ich die dritte Zeile von unten verlassen Kommentar gesetzt, das Programm abgeschlossen ist und ich erhalte die folgende Ausgabe:

Pfad gebaut! Pfad:. \ Testfile3.txt

Wenn ich es Kommentar-, bekomme ich diesen Fehler: Zugriffsverletzung Leseort 0x0000005C

Kann jemand zeigen, wo dies nicht in Ordnung ist? Gibt es eine Standardmethode zum Erstellen von Pfaden in C?

+0

* Namen irgendwo im Code * ... wo? poste das auch. Verwenden Sie stattdessen 'snprintf()', das ist einfacher und sauberer. –

+0

Willkommen bei Stack Overflow. Bitte lesen Sie die [Über] und [Ask] Seiten bald, aber noch wichtiger, lesen Sie bitte, wie man ein MCVE ([MCVE]) erstellen. Beachten Sie, dass 'char * folder1_files [filecount /];' ein Syntaxfehler ist; meinst du "filecount1"? –

+0

dritte Zeile von unten ist int l = 0; Wenn Sie es kommentieren, hätte es einen Kompilierzeitfehler bei strcat (buffer, folder2_files [l]) erzeugt; mit l undefined –

Antwort

1

Zeichenkonstanten wie PATH_SEP sind nicht automatisch NUL-terminiert. Wenn Sie

strcat(buffer, PATH_SEP); 

die strcat Routine aufrufen erwartet, dass beide Argumente zu NUL-terminierten Strings zeigen. Da PATH_SEP nicht NUL-beendet ist, fährt die Routine damit fort, den Speicher zu durchsuchen und nach einem NUL-Byte zu suchen. Irgendwann überschreibt es entweder etwas Wichtiges oder Speicherzugriff, sollte es nicht.

ändern

char *PATH_SEP = '\\'; 

zu

char *PATH_SEP = "\\"; 

und Ihr Code sollte wie erwartet.

Viel Glück.

+0

Vielen Dank! Ich wusste nicht, dass Charakterkonstanten nicht NUL-terminiert sein würden. Ich habe char * PATH_SEP = '\\' geändert; zu "\\\ 0" und es hat tatsächlich wie erwartet funktioniert! –

1

Die dritte Zeile von unten ist

int l = 0; 

Wenn Sie kommentieren Sie sie aus, wird Ihr Code nicht kompiliert werden, da Sie l erklären müssen, bevor es zu benutzen.

Die vierte Zeile von unten ist

//strcat(buffer, PATH_SEP); 

Die Linie

char *PATH_SEP = '\\'; 

macht keinen Sinn, weil Sie String (char *) mit Zeichen (char) zu initialisieren. Alles in Anführungszeichen ist eine Zeichenkette, alles in Anführungszeichen ist ein Zeichen. Also zeigt Ihr PATH_SEP auf einen Müll.