自从我搞砸了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 *,所以我试着坚持使用它以便于阅读。
答案 0 :(得分:2)
好的 - 让你的生活变得复杂......
strrchr
查找上一个\
memcpy
(除非您有strncpy
)将字符数复制到该点。我应该添加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);