我是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中构建路径?
答案 0 :(得分:1)
底部的第三行是
int l = 0;
如果你发表评论,你的代码将无法编译,因为你需要在使用之前声明l
。
底部的第四个行是
//strcat(buffer, PATH_SEP);
该行
char *PATH_SEP = '\\';
没有意义,因为你用字符(char)初始化字符串(char *)。双引号中的任何内容都是字符串,单引号中的任何内容都是字符。所以你的PATH_SEP指向垃圾。
答案 1 :(得分:1)
PATH_SEP
等字符常量不会自动终止NUL。当你打电话
strcat(buffer, PATH_SEP);
strcat
例程要求两个参数都指向NUL终止的字符串。因为PATH_SEP不是NUL终止,所以例程继续扫描内存,寻找NUL字节。最终它会覆盖重要的东西或不应该访问内存。
更改
char *PATH_SEP = '\\';
到
char *PATH_SEP = "\\";
并且您的代码应该按预期执行。
祝你好运。