使用char *存储正确的文件路径

时间:2011-08-08 14:01:03

标签: c++ char c-strings

自从我搞砸了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 *,所以我试着坚持使用它以便于阅读。

5 个答案:

答案 0 :(得分:2)

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

  1. 使用strrchr查找上一个\
  2. 使用memcpy(除非您有strncpy)将字符数复制到该点。
  3. 我应该添加1.将返回 last \,因此,如果您的路径类似C:/foo/bar/,则会停在/ - 所以你必须做一些边界检查......我确实说过“让你的生活变得复杂”......

答案 1 :(得分:1)

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

编辑:哦,我不知道strrchar,这肯定是理想的。 你将不得不只需要循环遍历char字符串,从最后一个索引开始并向后工作,使用strrchar查找路径字符(在你的字符串中显示为“/”) case,但你必须确保始终如此)然后将字符串副本(strcpy或其中一个相关函数)作为所需路径的一部分,直到找到最后一个文件夹开头的索引。

请务必检查特殊情况,例如

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

2)没有返回路径。

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

答案 2 :(得分:0)

提示:

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

答案 3 :(得分:0)

_getcwd不是标准函数,但我找不到支持其使用的任何变体。相反,使用null参数的用法行为要么记录为未指定,要么记录为错误处理程序。

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

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

  

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

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

欢呼&第h。,

答案 4 :(得分:0)

这样的东西?

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