guyuealian
pan_jinquan
采纳率75%
2018-05-31 08:02

C/C++字符串截取的问题

40
已采纳

//假设我有一个字符串路径:
string path = "D:\Program Files\opencv\A1.jpg";
//或者是这样的路径:
string path = "D:/Program Files/opencv/B11.jpg";
简而言之,就是获取路径中的文件名字“A1.jpg”和“B11.jpg”,如何用C++编程实现

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

21条回答

  • haidaolongdehao haidaolongdehao 3年前

    #include
    #include

    using namespace std;

    int main()
    {
    string strPath(""D:\Program Files\opencv\A1.jpg""); // string中的\是转义字符,\就是代表\
    string strFileName;
    int nPos = strPath.find_last_of('\');
    if(nPos > 0)
    {
    strFileName = strPath.substr(nPos + 1, strPath.length() - nPos - 1);
    cout << strFileName << endl;
    }
    return 0;
    }

    另外一种情况类似:

    点赞 评论 复制链接分享
  • qq_15332309 qq_15332309 3年前

    反向截取喽,碰到/或\结束

    点赞 2 评论 复制链接分享
  • liugan528 GarryLau 3年前

    用强大的boost库吧

     #include <boost/algorithm/string.hpp>
    #include <iostream>
    #include <string>
    
    
    int main() {
    
        std::string path1 = "D:\\Program Files\\opencv\\A1.jpg";
        std::string path2 = "D:/Program Files/opencv/B11.jpg";
    
        /* 找到最后一个\\ */
        auto it1 = boost::find_last(path1,"\\");
    
        /* 找到最后一个/ */
        auto it2 = boost::find_last(path2, "/");
    
        /* name1为A1.jpg;it1.end()指向'A'的位置 */
        std::string name1 = std::string(it1.end(), path1.end());
    
        /* name2为B11.jpg;it1.end()指向'B'的位置 */
        std::string name2 = std::string(it2.end(), path2.end());
    
        std::cout << name1 << std::endl;
        std::cout << name2 << std::endl;
    
        system("pause");
    }
    
    点赞 1 评论 复制链接分享
  • qq_28025073 little sister丶 3年前

    char fn[100];
    char path[500] = "D:\Program Files\opencv\A1.jpg";
    char *ptr = strrchr(path , '\');
    sprintf(fn,"%s",ptr+1);
    或者
    char fn[100];
    char path[500] = "D:/Program Files/opencv/B11.jpg";
    char *ptr = strrchr(path , '/');
    sprintf(fn,"%s",ptr+1);

    点赞 1 评论 复制链接分享
  • ZhouXiaoXiang1234 xxxxx12345678999 3年前

    const string path = "D:\Program Files\opencv\A1.jpg";
    int pos = path.rfind('\');
    int len = path.length();
    string sub = path.substr(pos, len);

    点赞 评论 复制链接分享
  • qq_15623157 qq_15623157 3年前

    利用std::string特性从后面寻找/,就可以了,

    点赞 评论 复制链接分享
  • qq_39038878 qq_39038878 3年前

    如果是Windows下的话有现成的代码:

    #include

    #include
    #include
    #pragma comment (lib,"Shlwapi.lib")
    using namespace std;

    int main(void)
    {
    string path = "D:\Program Files\opencv\A1.jpg";
    string path2 = "D://Program Files//opencv//B11.jpg";
    string ret = PathFindFileName(path.c_str());
    string ret2 = PathFindFileName(path2.c_str());
    system("pause");
    return 0;
    }

    点赞 评论 复制链接分享
  • qq_30723429 傅洪明 3年前

    先获取斜杠位置,然后截取啊

    点赞 评论 复制链接分享
  • sinat_21128663 sinat_21128663 3年前

    string s(path.substr(pos + 1) );

    点赞 评论 复制链接分享
  • weixin_40234239 weixin_40234239 3年前

    从末尾反向寻找\或/,截取

    点赞 评论 复制链接分享
  • wangzizi12300 一叶清枫 3年前

    有库函数直接用就可以获取路径和文件名,扩展名

    点赞 评论 复制链接分享
  • qq_27848369 hot2dog 3年前

    找到最后一个\ 或者 找到最后一个/ , 截取就行了哇。。。。。

    点赞 评论 复制链接分享
  • ZhihengTao ZhihengTao 3年前

    Separate string with specific tokens (使用指定的一个或多个标记划分字符串)

    Simply separate (简单划分)

    string: "abc;def ghi:jkl"
    delim: ":; "
    
    • abc
    • def
    • ghi
    • jkl
    char *src = "abc;def ghi:jkl";
    char *delim = ":; "
    
    sub_str = token(str, delim);
    printf("%s\n", sub_str);
    
    while((sub_str = token(NULL, delim)) != NULL)
    {
        printf("%s\n", sub_str);
    }
    

    Hierarchically separe (层级划分)

    string: "a/bbb///cc;xxx:yyy:"
    delim: ":;"
    sub-delim: "/"
    
    • a/bbb///cc

      • a
      • bbb
      • cc
    • xxx

      • xxx
    • yyy

      • yyy
    char *str1, *str2;
    char *delim, *subdelim;
    char *token, *subtoken;
    char *saveptr1, *saveptr2;
    
    str1 = "a/bbb///cc;xxx:yyy:";
    delim = ";:";
    subdelim = "/";
    
    while(1) 
    {
        token = strtok_r(str1, delim, &saveptr1);
        if(token == NULL)
            break;
        printf("-> %s", token);
    
        while(1)
        {
            sub_token = strtok_r(str2, subdelim, &saveptr2);
            if(sub_token == NULL)
                break;
            printf("--> %s", sub_token);
            str2 = NULL;
        }
        str1 = NULL;
    }
    
    
    点赞 评论 复制链接分享
  • qq_33530709 qq_33530709 3年前

    反向截取喽,碰到/或\结束,很简单的

    点赞 评论 复制链接分享
  • qq_41904206 qq_41904206 3年前

    从字符串末尾开始一位一位的判断是否为‘/’或‘\’,若是则截取其后面的字符串

    点赞 评论 复制链接分享
  • qihong511002 qihong511002 3年前

    找到最后一个斜杠位置i=str.lastIndxOf('/'),然后截取ret=str.subString(i);

    点赞 评论 复制链接分享
  • admancy admancy 3年前

    先获取斜杠位置,然后截取

    点赞 评论 复制链接分享
  • dragonfly_mxj dragonfly_mxj 3年前

    利用C++ 标准的库函数应该可以实现。

    点赞 评论 复制链接分享
  • phenix2009 白色一大坨 3年前

    如果是Windows下的话有现成的代码:

     #include <iostream>   
    #include <string>
    #include <Shlwapi.h>
    #pragma comment (lib,"Shlwapi.lib")
    using namespace std;
    
    int main(void)
    {
        string path = "D:\\Program Files\\opencv\\A1.jpg";
        string path2 = "D://Program Files//opencv//B11.jpg";
        string ret = PathFindFileName(path.c_str());
        string ret2 = PathFindFileName(path2.c_str());
        system("pause");
        return 0;
    }
    
    点赞 评论 复制链接分享
  • qq_34564316 呵呵哒呵呵呵 3年前

    使用正则表达式匹配.和最后一个/实现

    点赞 评论 复制链接分享
  • zhouwu12 zhouwu12 3年前

    #include
    #include
    using std::cout;
    using std::endl;
    using std::string;
    int main(void){
    string str1="hi,test,hello";
    string str2="test";
    //搜索子串。返回子串第一个字符的索引
    cout << str1.find(str2)<<endl;
    //假设不存在,返回内置常量string::npos,在一些编译器中通常为4294967295
    cout << str1.find('k')<<endl;
    //从指定索引開始搜索
    cout <<str1.find('h',2)<<endl;
    //从指定索引搜索指定字符串的前n个字符
    cout <<str1.find("her",1,2)<<endl;

    //在指定字符集合中搜索字符,返回其索引
    cout <<str1.find_first_of("AaEeIiOoUu")<<endl;
         //从指定索引处開始在指定字符集合中搜索字符
    cout <<str1.find_first_of("AaEeIiOoUu",2)<<endl;
         //从指定索引处開始在指定字符集合中搜索指定长度字符
    cout <<str1.find_first_of("AaEeIiOoUu",2,2)<<endl;
    
    //在指定字符集合中逆向搜索字符,返回字符最后索引,相同也具有上面另外两个重载方法
    cout <<str1.find_last_of("AaEeIiOoUu")<<endl;
    
    //查找字符串中第一个不在字符集合中的字符
    cout <<str1.find_first_not_of("AaEeIiOoUu")<<endl;
    //查找字符串中最后一个不在字符集合中的字符
    cout <<str1.find_last_not_of("AaEeIiOoUu")<<endl;
    
    //逆向搜索,也具有和find()一样的重载方法
    cout <<str1.rfind('l')<<endl;
    
    //截取子串
    string str3=str1.substr(3,4);
    cout <<str3<<endl;
    return 0;
    

    }

    点赞 评论 复制链接分享