最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法

 更新時(shí)間:2022年06月17日 10:22:49   作者:我行我素,向往自由  
最近筆試經(jīng)常遇到需要對(duì)字符串進(jìn)行快速分割的情景,下面這篇文章主要給大家介紹了關(guān)于C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

如:

string str1 = "This is a test";
string str2 = "This-is-a-test";
string str2 = "This+is+a+test";

我們?nèi)绾螌⒁陨献址凑漳撤N分隔符( ,-,+),將其分割成四個(gè)子串,其值分別為 “This” “is” “a” “test” 。

一、使用stringstream流

這里我們只需要用到 istringstream(字符串輸入流) 構(gòu)造字符串流,然后從字符串流中按照一定的格式讀取數(shù)據(jù)即可。

通常我們使用 cin 從流中讀取數(shù)據(jù),而我們也可以使用 getline 讀取,而后者在讀取時(shí)可以選擇接受的數(shù)據(jù)格式,其函數(shù)原型如下:

// istream & getline(char* buf, int bufSize);    // 讀到 \n 為止
istream & getline(char* buf, int bufSize, char delim); //讀到 delim 字符為止
                // \n 或 delim 都不會(huì)被讀入 buf,但會(huì)被從文件輸入流緩沖區(qū)中取走

 因此,我們可以按照此方式設(shè)計(jì)一個(gè)C++中的string split函數(shù)。

void Stringsplit(string str,const const char split)
{
    istringstream iss(str);    // 輸入流
    string token;            // 接收緩沖區(qū)
    while (getline(iss, token, split))    // 以split為分隔符
    {
        cout << token << endl; // 輸出
    }
}

如此,我們就設(shè)計(jì)出了我們的Stringsplit() 函數(shù)。該函數(shù)有以下 2 種語(yǔ)法格式

void Stringsplit(string str,const const char split);
// 默認(rèn)將傳入的字符串str以split為分隔符進(jìn)行分割,并將得到的子串打印在屏幕上,無(wú)返回值
void Stringsplit(string str, const const char split,vector<string>& rst);
// 默認(rèn)將傳入的字符串str以split為分隔符進(jìn)行分割,    不會(huì)將子串打印在屏幕上,無(wú)返回值
//                     分割的子串將會(huì)保存在rst數(shù)組中被帶出函數(shù)。

 以上,我們簡(jiǎn)單的設(shè)計(jì)了一種C++中的分割字符串的函數(shù),下面來(lái)看一個(gè)測(cè)試用例:

int main() {
    string str("This is a test");
    Stringsplit(str, ' ');        // 打印子串
    
    vector<string> strList;
    string str2("This-is-a-test");
    Stringsplit(str2, '-', strList);    // 將子串存放到strList中
    for (auto s : strList)
        cout << s << " ";
    cout << endl;
    return 0;
}

# 輸出
This
is
a
test
This is a test

二、使用string類提供的find方法與substr方法

find函數(shù)原型: 

size_type find( const basic_string& str, size_type pos = 0 ) const;

參數(shù):

str - 要搜索的 string , pos - 開始搜索的位置

返回值

找到的子串的首字符位置,或若找不到這種子串則為 npos 。

substr函數(shù)原型: 

basic_string substr( size_type pos = 0, size_type count = npos ) const;

參數(shù):

pos - 要包含的首個(gè)字符的位置 ,count - 子串的長(zhǎng)度

返回值

含子串 [pos, pos+count) 的 string 。

由以上兩個(gè)函數(shù)我們便可以設(shè)計(jì)出我們的Stringsplit()來(lái)。同時(shí),因?yàn)閒ind()函數(shù)查找的可以是字符串,因此我們的分隔符可以是單個(gè)的字符,也可以是一個(gè)字符串。 

// 使用字符分割
void Stringsplit(const string& str, const char split, vector<string>& res)
{
    if (str == "")        return;
    //在字符串末尾也加入分隔符,方便截取最后一段
    string strs = str + split;
    size_t pos = strs.find(split);
 
    // 若找不到內(nèi)容則字符串搜索函數(shù)返回 npos
    while (pos != strs.npos)
    {
        string temp = strs.substr(0, pos);
        res.push_back(temp);
        //去掉已分割的字符串,在剩下的字符串中進(jìn)行分割
        strs = strs.substr(pos + 1, strs.size());
        pos = strs.find(split);
    }
}
// 使用字符串分割
void Stringsplit(const string& str, const string& splits, vector<string>& res)
{
    if (str == "")        return;
    //在字符串末尾也加入分隔符,方便截取最后一段
    string strs = str + splits;
    size_t pos = strs.find(splits);
    int step = splits.size();
 
    // 若找不到內(nèi)容則字符串搜索函數(shù)返回 npos
    while (pos != strs.npos)
    {
        string temp = strs.substr(0, pos);
        res.push_back(temp);
        //去掉已分割的字符串,在剩下的字符串中進(jìn)行分割
        strs = strs.substr(pos + step, strs.size());
        pos = strs.find(splits);
    }
}

下面是一個(gè)測(cè)試用例:

int main()
{
    vector<string> strList;
    string str("This-is-a-test");
    Stringsplit(str, '-', strList);
    for (auto s : strList)
        cout << s << " ";
    cout << endl;
 
    vector<string> strList2;
    string str2("This%20is%20a%20test");
    Stringsplit(str2, "%20", strList2);
    for (auto s : strList2)
        cout << s << " ";
    cout << endl;
    return 0;
}

# 輸出
This is a test
This is a test

三、使用C庫(kù)函數(shù)strtok

char* strtok( char* str, const char* delim );

參數(shù):

  • str - 指向要記號(hào)化的空終止字節(jié)字符串的指針
  • delim - 指向標(biāo)識(shí)分隔符的空終止字節(jié)字符串的指針

返回值:

指向下個(gè)記號(hào)起始的指針,或若無(wú)更多記號(hào)則為空指針。

需要注意的是,該函數(shù)使用一個(gè)全局的靜態(tài)變量來(lái)保存每次分割后的位置,因此在多線程中是不安全的,這里我們也可以選擇使用它的線程安全版本

 char *strtok_r(char *str, const char *delim, char **saveptr); 。
void Stringsplit(const string& str, const string& split, vector<string>& res)
{
    char* strc = new char[str.size() + 1];
    strcpy(strc, str.c_str());   // 將str拷貝到 char類型的strc中
    char* temp = strtok(strc, split.c_str());
    while (temp != NULL)
    {
        res.push_back(string(temp));        
        temp = strtok(NULL, split.c_str());    // 下一個(gè)被分割的串
    }
    delete[] strc;
}

如此,我們的使用 strtok 版本的Stringsplit() 就完成了。不過(guò),我們使用這種方法實(shí)現(xiàn)的字符串分割函數(shù)只能根據(jù)字符來(lái)分割,而我們傳入的參數(shù)是字符串類型,這樣可能會(huì)對(duì)函數(shù)的使用這造成誤導(dǎo)(注:參數(shù)傳入字符串用的雙引號(hào),傳入字符用的單引號(hào)),因此我們也可以使用下面的方法封裝一個(gè)參數(shù)是字符類型的函數(shù)。

void Stringsplit(const string& str, const char split, vector<string>& res)
{
    Stringsplit(str, string(1,split), res);    // 調(diào)用上一個(gè)版本的Stringsplit()
}

下面給出一個(gè)測(cè)試用例,我們分別使用單/雙引號(hào)傳入分割的限定字符。

int main()
{
    vector<string> strList;
    string str("This+is+a+test");
    Stringsplit(str, '+', strList);
    for (auto s : strList)
        cout << s << " ";
    cout << endl;
 
    vector<string> strList2;
    string str2("This-is-a-test");
    Stringsplit(str2, "-", strList2);
    for (auto s : strList2)
        cout << s << " ";
    cout << endl;
    return 0;
}

四、使用regex_token_iterator(正則表達(dá)式)

正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。 

而在C++的正則中,把這種操作稱為Tokenize分詞(或者叫切割)。這種操作剛好可以滿足我們的需求,用模板類regex_token_iterator<>提供分詞迭代器,可以完成字符串的分割。

void Stringsplit(const string& str, const string& split, vector<string>& res)
{
    //std::regex ws_re("\\s+"); // 正則表達(dá)式,匹配空格 
    std::regex reg(split);        // 匹配split
    std::sregex_token_iterator pos(str.begin(), str.end(), reg, -1);
    decltype(pos) end;              // 自動(dòng)推導(dǎo)類型 
    for (; pos != end; ++pos)
    {
        res.push_back(pos->str());
    }
}

測(cè)試用例:

int main()
{
    // 單個(gè)字符分詞
    vector<string> strList;
    string str("This is a test");
    Stringsplit(str," ", strList);
    for (auto s : strList)
        cout << s << " ";
    cout << endl;
 
    // 使用字符串分詞
    vector<string> strList2;
    string str2("ThisABCisABCaABCtest");
    Stringsplit(str2, "ABC", strList2);
    for (auto s : strList2)
        cout << s << " ";
    cout << endl;
}

# 輸出
This is a test
This is a test

總結(jié)

到此這篇關(guān)于C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)C++ 字符串分割函數(shù)split()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉

    C語(yǔ)言常用庫(kù)函數(shù)的使用及模擬實(shí)現(xiàn)詳解例舉

    C語(yǔ)言庫(kù)函數(shù)是把自定義函數(shù)放到庫(kù)里,是別人把一些常用到的函數(shù)編完放到一個(gè)文件里,供程序員使用,下面讓我們一起來(lái)詳細(xì)了解它
    2022-04-04
  • C語(yǔ)言尋找無(wú)向圖兩點(diǎn)間的最短路徑

    C語(yǔ)言尋找無(wú)向圖兩點(diǎn)間的最短路徑

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言尋找無(wú)向圖兩點(diǎn)間的最短路徑,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C語(yǔ)言線性表順序存儲(chǔ)結(jié)構(gòu)實(shí)例詳解

    C語(yǔ)言線性表順序存儲(chǔ)結(jié)構(gòu)實(shí)例詳解

    這篇文章主要介紹了C語(yǔ)言線性表順序存儲(chǔ)結(jié)構(gòu)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • Qt實(shí)現(xiàn)計(jì)算器功能

    Qt實(shí)現(xiàn)計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++解析wav文件方法介紹

    C++解析wav文件方法介紹

    最近將項(xiàng)目改為跨平臺(tái),于是音頻模塊從微軟的XAudio2改用OpenAL庫(kù)。之前使用MSDN的代碼,所以現(xiàn)在改為了C++標(biāo)準(zhǔn)的寫法,適用性更廣
    2022-09-09
  • C++11實(shí)現(xiàn)字符串分割的示例

    C++11實(shí)現(xiàn)字符串分割的示例

    本文主要介紹了C++11實(shí)現(xiàn)字符串分割的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C語(yǔ)言中的setlinebuf()、utmpname()、rewind函數(shù)使用

    C語(yǔ)言中的setlinebuf()、utmpname()、rewind函數(shù)使用

    這篇文章主要介紹了C語(yǔ)言中的setlinebuf()、utmpname()、rewind函數(shù)使用,是C語(yǔ)言中操作文件的一些基本函數(shù),需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言數(shù)組全面詳細(xì)講解

    C語(yǔ)言數(shù)組全面詳細(xì)講解

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-05-05
  • Qt實(shí)現(xiàn)棋盤游戲

    Qt實(shí)現(xiàn)棋盤游戲

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)棋盤游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • c++傳輸文件到不同計(jì)算機(jī)上的示例代碼

    c++傳輸文件到不同計(jì)算機(jī)上的示例代碼

    這篇文章主要為大家詳細(xì)介紹了c++傳輸文件到不同計(jì)算機(jī)上的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03

最新評(píng)論

荆州市| 小金县| 定西市| 勃利县| 临洮县| 嵊泗县| 常山县| 灌南县| 宝坻区| 墨竹工卡县| 东至县| 曲松县| 栾城县| 阿荣旗| 桃园市| 宜章县| 阳东县| 盐池县| 策勒县| 兰州市| 成武县| 阿鲁科尔沁旗| 中卫市| 和顺县| 大城县| 永济市| 南漳县| 宝兴县| 阿荣旗| 潜山县| 克拉玛依市| 曲水县| 阿图什市| 嘉善县| 贵阳市| 古田县| 巨野县| 沈阳市| 金溪县| 金乡县| 刚察县|