我需要使用char*
分隔符将文件的完整路径拆分为两个\
。
例如:
c:\temp\file.dll
应解析为这两个char*
:
1) c:\temp\
2) file.dll
我考虑过使用strtok
,但有没有更简单的方法可以在不使用令牌并在分割后重新组合char*
(strtok
将会这样做)。
这应该适用于Windows。
干杯。
答案 0 :(得分:1)
从头到尾进行搜索,这应该有效:
char* findlastof(char* s, char* delim) {
char* r;
for(r=s; *s; s++)
for(char* x = delim;*x;x++)
if(*s==*x) {
r = s;
break;
}
return s;
}
将其路径分隔符输入,您将获得基本名称 将这条路径作为练习留给读者。
答案 1 :(得分:0)
如果您有权访问boost::string_ref
,那么它已经完成。
std::pair<boost::string_ref, boost::string_ref> split(boost::string_ref path) {
size_t const lastSlash = path.rfind('/');
return std::make_pair(path.substr(0, lastSlash+1), path.substr(lastSlash+1));
}
如果你不这样做,我建议你重新创建这个课程(你可以从Boost Header中获得很大的启发,因为它的自由许可)因为它真的让这种工作变得如此简单。
答案 2 :(得分:0)
正如评论中所建议的那样,使用splitpath。
尽管使用安全版splitpath_s
答案 3 :(得分:0)
即使不使用Windows _splitpath
等专用功能,使用标准字符串功能也很容易。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void)
{
char *fullpath = "c:\\temp\\file.dll";
char *ptr, *pathname, *filename;
ptr = strrchr (fullpath, '\\');
if (ptr == NULL)
return EXIT_FAILURE;
filename = strdup (ptr+1);
if (filename == NULL)
return EXIT_FAILURE;
pathname = malloc((size_t)(ptr-fullpath+2));
if (pathname == NULL)
return EXIT_FAILURE;
pathname[ptr-fullpath+1] = 0;
strncpy (pathname, fullpath, (size_t)(ptr-fullpath+1));
printf ("pathname [%s]\n", pathname);
printf ("filename [%s]\n", filename);
return EXIT_SUCCESS;
}
输出:
pathname [c:\temp\]
filename [file.dll]
答案 4 :(得分:0)
您可以使用boost :: filesystem:
#include <boost/filesystem.hpp>
#include <iostream>
int main() {
//boost::filesystem::path path("c:\\temp\\file.dll");
boost::filesystem::path path("c:/temp/file.dll");
std::cout << path.parent_path() << ", " << path.filename() << '\n';
}
给出了:
"c:/temp", "file.dll"
(在我的linux系统上)
答案 5 :(得分:-1)
如果可以修改原始字符串:
char *fullpath = "c:\\temp\\file.dll";
char *p = strrchr(fullpath, '\\');
if(p) {
*p = '\0';
char *filename = p+1;
char *pathname = fullpath;
// ...
}
虽然路径不会终止。