从 C 中的字符串构建路径

Building a path from strings in C

我是 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);

如果我将倒数第三行注释掉,程序将完成并得到以下输出:

路径已建立! 路径:.\testfile3.txt

如果我取消注释,我会得到这个错误:访问冲突读取位置 0x0000005C

谁能指出哪里出了问题?在 C 中是否有更标准的构建路径的方法?

倒数第三行是

int l = 0;

如果你把它注释掉,你的代码将不会编译,因为你需要在使用它之前声明l

倒数第第四行是

//strcat(buffer, PATH_SEP);

char *PATH_SEP = '\';

没有意义,因为你用字符 (char) 初始化字符串 (char*)。双引号中的任何内容都是字符串,单引号中的任何内容都是字符。所以你的 PATH_SEP 指向一个垃圾。

PATH_SEP 等字符常量不会自动以 NUL 结尾。当你打电话

strcat(buffer, PATH_SEP);

strcat 例程要求两个参数都指向以 NUL 结尾的字符串。因为 PATH_SEP 不是 NUL 终止,例程继续扫描内存,寻找 NUL 字节。最终它要么覆盖一些重要的东西,要么访问它不应该访问的内存。

改变

char *PATH_SEP = '\';

char *PATH_SEP = "\";

并且您的代码应该按预期执行。

祝你好运。