【问题标题】:Using a char* to store the correct file path使用 char* 存储正确的文件路径
【发布时间】:2011-08-08 14:01:02
【问题描述】:

自从我弄乱 C/C++ 以来已经有一段时间了,我对使用 char* 的可用函数的记忆已经消失了。

我目前使用以下代码获取当前工作目录...

char *path = NULL;
size_t size = 0;

path = _getcwd(path, size);
Msg("Current Working Directory: %s\n", path);

但是,我需要走这条路,然后把最后一个目录剪掉,放到上一个目录。它目前在路径中存储诸如“C:/srcds/orangebox”之类的东西,我需要从中删除最后一个目录以获得正确的路径。在这种情况下,它将是“C:/srcds”。

使用 char* 执行此操作的最佳方法是什么?请不要建议使用字符串。我知道这非常容易,但我使用的 SDK 主要围绕 char* 进行,所以我尽量坚持使用它以提高可读性。

【问题讨论】:

  • std::string 有问题吗?当您的 API 需要 char const*... 时,请尽可能晚地应用 .c_str()。真的。特别是如果您关心“可读性”(“易读性”)。什么是“C/C++”?
  • 你总是可以附加一个'../'
  • 如果你实际使用 C++ 工作,你甚至只会称它们为 C 字符串,而不是其他任何东西。
  • 实际上,我会使用boost::filesystem

标签: c++ char c-strings


【解决方案1】:

好吧 - 让你的生活变得复杂..

  1. 使用strrchr 查找最后一个\
  2. 使用memcpy(除非您有strncpy)将字符数复制到该点。

我应该补充一点 1. 将返回 last \,所以如果你的路径像 C:/foo/bar/,它将停在 / - 所以你必须这样做一些边界检查......我确实说过“让你的生活复杂”......

【讨论】:

    【解决方案2】:

    将其转换为字符串会非常容易,执行 find_last_of 然后通过调用 c_str 将其转换回 char*。但既然这不是一个选择:

    编辑:哦,我不知道strrchar,那绝对是理想的。 您将不得不循环遍历char字符串,从最后一个索引开始并向后工作,使用strrchar查找路径字符(在您的情况下似乎是“/”,但您必须确保始终如此),然后将字符串复制(strcpy 或相关函数之一)您想要的路径部分,直到找到最后一个文件夹的开头的索引。

    一定要检查特殊情况,比如

    1) 返回的路径只有一个目录。

    2) 没有返回路径。

    3) _getcwd 可能返回的任何其他情况 - 检查该方法的文档。

    【讨论】:

      【解决方案3】:

      提示:

      int len= strlen(path);
      len--;
      while(path[len]!='\\')
      {
        len--;
      }
      path[len]='\0';
      

      【讨论】:

        【解决方案4】:

        _getcwd 不是标准功能,但我找不到任何支持您使用的变体。相反,您使用的行为(带有空参数)要么记录为未指定,要么记录为调用错误处理程序。

        要以一般方式处理路径,请考虑使用Boost Filesystem library

        编辑:我发现了以下内容:

        作为 POSIX.1-2001 标准的扩展,Linux(libc4、libc5、 glibc) getcwd() 如果 buf 使用 malloc() 动态分配缓冲区 通话时为 NULL。在这种情况下,分配的缓冲区具有长度 大小,除非大小为零,当 buf 被分配到必要的大小时。 如果它们有可能(并且实际上是可取的)释放()缓冲区 已经通过这种方式获得了。

        注意在 Windows 中的行为是相反的,即保证失败。

        干杯,

        【讨论】:

          【解决方案5】:

          这样的?

              char *FullPath = "C:/srcds/orangebox";
          
              char Buffer[100];
          
              strcpy(Buffer, FullPath);
          
              char* Temp = strchr(Buffer, '/');  // find first slash
          
              if (Temp == NULL)
                  ; // handle error
          
              Temp++;  // skip past slash
              if (Temp == NULL)
                  ; // handle error
          
              Temp = strchr(Temp, '/');  // find second slash
          
              if (Temp == NULL)
                  ; // handle error
          
              *Temp = 0;  // add string terminator
          
              puts(Buffer);
          

          【讨论】:

            猜你喜欢
            • 2016-10-05
            • 2017-01-15
            • 2020-11-12
            • 2011-09-02
            • 2021-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多