美文网首页C++ C++程序员
C++字符串分割方法总结

C++字符串分割方法总结

作者: litexy | 来源:发表于2017-11-27 20:40 被阅读0次

    在一些编程练习中,经常会对字符串进行处理,往往处理之前都会对字符串进行分割来提取各部分信息。在C++中虽然没有像python那样提供split这样直接的字符串分割函数,但也有一些其他的方法能够对其进行分割,下面介绍几种C++中常用的字符串分割方法。


    通过string成员函数实现

    在C++ string类中,提供了两个成员函数可以用来实现字符串分割,一个是find函数,另一个是substr函数,下面看一下这两个函数的声明。
    find函数:
    原型: size_t find (const string& str, size_t pos = 0) const;
    功能:查找子字符串第一次出现的位置。
    参数说明:str为子字符串,pos为初始查找位置。
    返回值:找到的话返回第一次出现的位置,否则返回string::npos。
    substr函数:
    原型: string substr (size_t pos = 0, size_t len = npos) const;
    功能:在原字符串中截取子字符串。
    参数说明:pos为起始位置,len为要截取子字符串的长度。
    返回值:子字符串。
    下面代码实现了字符串分割函数:

    vector<string> split(const string &str, const string &pattern)
    {
        vector<string> res;
        if(str == "")
            return res;
        //在字符串末尾也加入分隔符,方便截取最后一段
        string strs = str + pattern;
        size_t pos = strs.find(pattern);
    
        while(pos != strs.npos)
        {
            string temp = strs.substr(0, pos);
            res.push_back(temp);
            //去掉已分割的字符串,在剩下的字符串中进行分割
            strs = strs.substr(pos+1, strs.size());
            pos = strs.find(pattern);
        }
    
        return res;
    }
    

    通过strtok函数实现

    strtok为C语言中的字符串分割函数,其具体解释如下:
    原型:char * strtok ( char * str, const char * delimiters );
    功能:分割字符串str,delimiters为指定的分割符,可以有多个。
    说明:strtok只能接受C风格的字符串,如果是string类型,可以使用c_str函数进行转换。strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时 则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回被分割出片段的指针。
    实现代码如下:

    vector<string> split2(const string &str, const string &pattern)
    {
        char * strc = new char[strlen(str.c_str())+1];
        strcpy(strc, str.c_str());   //string转换成C-string
        vector<string> res;
        char* temp = strtok(strc, pattern.c_str());
        while(temp != NULL)
        {
            res.push_back(string(temp));
            temp = strtok(NULL, pattern.c_str());
        }
        delete[] strc;
        return res;
    }
    

    通过stringstream实现

    stringstream为字符串输入输出流,继承自iostream,灵活地使用stringstream流可以完成很多字符串处理功能,例如字符串和其他类型的转换,字符串分割等。在这里,我们使用其实现字符串分割功能。注意stingstream的使用需要包含sstream头文件。

    vector<string> split3(const string &str, const char pattern)
    {
        vector<string> res;
        stringstream input(str);   //读取str到字符串流中
        string temp;
        //使用getline函数从字符串流中读取,遇到分隔符时停止,和从cin中读取类似
        //注意,getline默认是可以读取空格的
        while(getline(input, temp, pattern))
        {
            res.push_back(temp);
        }
        return res;
    }
    

    关于stringstream的具体说明可以参见:
    http://www.cplusplus.com/reference/sstream/stringstream/?kw=stringstream


    感谢您的阅读!

    相关文章

      网友评论

        本文标题:C++字符串分割方法总结

        本文链接:https://www.haomeiwen.com/subject/csfjbxtx.html