根据分隔符将char *拆分为两个char *

时间:2014-04-30 13:16:28

标签: c string char

我需要使用char*分隔符将文件的完整路径拆分为两个\

例如:

c:\temp\file.dll

应解析为这两个char*

1) c:\temp\

2) file.dll

我考虑过使用strtok,但有没有更简单的方法可以在不使用令牌并在分割后重新组合char*strtok将会这样做)。

这应该适用于Windows。

干杯。

6 个答案:

答案 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;
  // ...
}

虽然路径不会终止。