【问题标题】:Proper way to build up a path using cstrings in C++在 C++ 中使用 cstrings 构建路径的正确方法
【发布时间】:2011-04-23 04:25:12
【问题描述】:

我需要建立一个文件的路径。我有以下类方法:

void Directory::scanDirectory(char *directory) {
    DIR *dirp;
    struct dirent *entry;
    char path[1];

    if(dirp = opendir(directory)) {
        while(entry = readdir(dirp)) {
            if (entry->d_name[0] != '.') {
                strcpy(path, directory);
                strcat(path, "/");
                strcat(path, entry->d_name);
                if (entry->d_type == 8) {
                    // Files
                } else if (entry->d_type == 4) {
                    //scanDirectory(path);
                }
                printf("Name: %s, Type: %d\n", entry->d_name, entry->d_type);
            }
        }
        closedir(dirp);
    }
}

我需要通过连接目录和entry->d_name 来构建文件路径。当我尝试运行此代码时,它会出现段错误。据我所知,它在我构建路径的地方出现了段错误。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c++ string concatenation cstring


    【解决方案1】:

    您只为路径 (char path[1]) 分配了一个字节。您需要分配足够的空间来实际保存您正在创建的整个路径。给定 C++ 标签,显而易见的可能性是使用 std::string,在将所有部分组合成完整路径后,使用其 c_str() 成员函数以 C 风格访问内容字符串。

    【讨论】:

      【解决方案2】:

      为什么不使用Boost.Filesystem

      【讨论】:

        【解决方案3】:

        缓冲区path 需要有足够的空间来容纳整个路径。现在它只有一个字符的空间。试着把它变大。 strcat 本身不分配空间。您必须手动管理该内存。

        至于更好的方法,您可能需要考虑使用string。您无需担心内存问题,并且可以与 + 运算符连接。

        【讨论】:

          【解决方案4】:

          char path[1]; 更改为:

          char path[512]; //or whatever value you like.
          

          在您的代码中,路径仅为 1 个字符和 \0 分配空间。显然你需要一个更大的,据我所知,在 unix 中,目录名称最多可以有 255 个字符,所以我认为 512 就足够了。

          【讨论】:

            【解决方案5】:

            小心使用strcpy。它不做边界检查,所以即使path 只是char[1],它也会尝试将所有directory 复制到其中。这可能是你的段错误。

            在如何构建字符串方面,您有很多选择。这是一篇关于 C++ 字符串连接效率的长 SO 帖子:

            Efficient string concatenation in C++

            如果您使用的是 C++,有什么理由不能将内置的 string 库与 + 运算符一起使用?例如:

            string path;
            //...
            path += directory;
            path += "/";
            path += entry->d_name;
            //etc.
            

            使用string 类的效率可能稍低,但它还有一个额外的好处是可以帮助您避免缓冲区溢出问题和内存异常,例如您遇到的分段错误(我不是说string 会避免所有这些,但它会让你的生活更轻松)。

            之前还有一篇关于如何在 C++ 中构建目录字符串的 SO 帖子:

            c++ how to create a directory from a path

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-10-16
              • 1970-01-01
              • 2020-09-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-04-28
              相关资源
              最近更新 更多