0

自从我弄乱 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* 进行,所以我尝试坚持使用它以提高可读性。

4

5 回答 5

2

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

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

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

于 2011-08-08T14:06:01.640 回答
1

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

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

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

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

2) 没有返回路径。

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

于 2011-08-08T14:06:57.880 回答
0

暗示 :

int len= strlen(path);
len--;
while(path[len]!='\\')
{
  len--;
}
path[len]='\0';
于 2011-08-08T14:07:19.307 回答
0

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

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

编辑:我发现以下内容:

作为 POSIX.1-2001 标准的扩展,Linux (libc4, libc5, glibc) getcwd() 会在调用时使用 malloc() 动态分配缓冲区。在这种情况下,分配的缓冲区具有长度大小,除非大小为零,当 buf 被分配到必要的大小时。如果以这种方式获得缓冲区,则可以(并且确实建议) free() 缓冲区。

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

干杯&hth.,

于 2011-08-08T14:11:42.307 回答
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);
于 2011-08-08T14:36:55.860 回答