【问题标题】:Building a path from strings in C从 C 中的字符串构建路径
【发布时间】:2017-11-06 03:25:55
【问题描述】:

我是 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 语言构建路径?

【问题讨论】:

  • 在代码中的其他地方命名 ...在哪里?也张贴那个。改用snprintf(),这样更简单、更干净。
  • 欢迎来到 Stack Overflow。请尽快阅读 AboutHow to Ask 页面,但更重要的是,请阅读有关如何创建 MCVE (minimal reproducible example) 的信息。注意char *folder1_files[filecount/]; 是一个语法错误;你的意思是filecount1
  • 倒数第三行是 int l = 0 ;如果你评论它,它会在 strcat(buffer, folder2_files[l]); 处产生编译时错误。与 l 未定义
  • @JonathanLeffler 啊是的......那里有几个错别字。感谢您的反馈。

标签: c special-characters filepath strcat


【解决方案1】:

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

strcat(buffer, PATH_SEP);

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

改变

char *PATH_SEP = '\\';

char *PATH_SEP = "\\";

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

祝你好运。

【讨论】:

  • 非常感谢!我不知道字符常量不会被 NUL 终止。我改变了 char *PATH_SEP = '\\';到“\\\0”,它确实按预期工作!
【解决方案2】:

倒数第三行是

int l = 0;

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

从底部算起的第四行

//strcat(buffer, PATH_SEP);

线

char *PATH_SEP = '\\';

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

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多