亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何在c++中實現字符串分割函數split詳解

 更新時間:2019年11月26日 08:33:16   作者:青荼  
這篇文章主要給大家介紹了關于如何在c++中實現字符串分割函數split的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用c++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

在學習c++中string相關基本用法的時候,發(fā)現了sstream的istringstream[1]可以將字符串類似于控制臺的方式進行輸入,而實質上這個行為等同于利用空格將一個字符串進行了分割,于是考慮到可以利用這個特性來實現c++庫函數中沒有的字符串分割函數split

string src("Avatar 123 5.2 Titanic K");
istringstream istrStream(src); //建立src到istrStream的聯系
string s1, s2;
int n; double d; char c;
istrStream >> s1 >> n >> d >> s2 >> c;
//以空格為分界的各數值則輸入到了對應變量上

實現細節(jié)

目的是可以像js中一樣,調用一個函數即可以方便地獲取到處理完畢后的字符串數組,根據c++的實際情況再進行參數調整。

1. 輸入輸出:

string* split(int& length, string str, const char token = ' ')

返回:處理完的字符串數組的首地址

傳入:字符串str、分隔符token(默認參數為空格)、以及引用參數length,指明處理完畢后動態(tài)分配的數組長度

2. 數據透明處理:

由于istringstream會像cin一樣,把空格視為數據間的界限,所以當分隔符不是空格時,需要將傳入的分隔符換為空格,并且要提前對原有空格進行數據透明處理

字符替換利用了庫algorithm中的replace() [2]

 const char SPACE = 0;
 if(token!=' ') {
 // 先把原有的空格替換為ASCII中的不可見字符
 replace(str.begin(), str.end(), ' ', SPACE); 
 // 再把分隔符換位空格,交給字符串流處理
 replace(str.begin(), str.end(), token, ' ');
 }

  假設輸入字符串為:"a b,c,d,e,f g"
  分隔符為非空格:','
  則被替換為:"aSPACEb c d e fSPACEg"

3. 數據分割:

 //實例化一個字符串輸入流,輸入參數即待處理字符串
 istringstream i_stream(str); 
 //將length置零
 length = 0; 
 queue<string> q;
 //用一個string實例s接收輸入流傳入的數據,入隊并計數
 string s;
 while (i_stream>>s) {
 q.push(s);
 length++;
 }

4. 數組生成:

 //根據計數結果動態(tài)開辟一個字符串數組空間
 string* results = new string[length]; 
 //將隊列中的數據轉入數組中
 for (int i = 0; i < length; i++) {
 results[i] = q.front();
 //將替換掉的空格進行還原
 if(token!=' ') replace(results[i].begin(), results[i].end(), SPACE, ' ');
 q.pop();
 }

完整代碼

#include <iostream>
#include <string>
#include <queue>
#include <sstream>
#include <algorithm>
using namespace std;

string* split(int& length, string str,const char token = ' ') {
 const char SPACE = 0;
 if(token!=' ') {
 replace(str.begin(), str.end(), ' ', SPACE);
 replace(str.begin(), str.end(), token, ' ');
 }
 istringstream i_stream(str);
 queue<string> q;
 length = 0;
 string s;
 while (i_stream>>s) {
 q.push(s);
 length++;
 }
 string* results = new string[length];
 for (int i = 0; i < length; i++) {
 results[i] = q.front();
 q.pop();
 if(token!=' ') replace(results[i].begin(), results[i].end(), SPACE, ' ');
 }
 return results;
}

//測試:
int main() {
 int length;
 string* results = split(length, "a b,c,d,e,f g", ',');
 for (int i = 0; i < length; i++) cout<<results[i]<<endl;
 return 0;
}

參考

[1] C++ string類(C++字符串)完全攻略

[2] C++ string 替換指定字符

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • C語言版約瑟夫問題算法實現

    C語言版約瑟夫問題算法實現

    大家好,本篇文章主要講的是C語言版約瑟夫問題算法實現,感興趣的同學趕快來看一看吧,對你又幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 用C語言求解第N項斐波那契數列問題

    用C語言求解第N項斐波那契數列問題

    這篇文章主要介紹了用C語言求解第N項斐波那契數列問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言中求和、計算平均值、方差和標準差的實例

    C語言中求和、計算平均值、方差和標準差的實例

    這篇文章主要介紹了C語言中求和、計算平均值、方差和標準差的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 全排列算法的非遞歸實現與遞歸實現的方法(C++)

    全排列算法的非遞歸實現與遞歸實現的方法(C++)

    本篇文章是對全排列算法的非遞歸實現與遞歸實現的方法進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言基于EasyX繪制時鐘

    C語言基于EasyX繪制時鐘

    這篇文章主要為大家詳細介紹了C語言基于EasyX繪制時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C 字符串數組排序的小例子

    C 字符串數組排序的小例子

    C 字符串數組排序的小例子,需要的朋友可以參考一下
    2013-03-03
  • C++ float、double判斷是否等于0問題

    C++ float、double判斷是否等于0問題

    這篇文章主要介紹了C++ float、double判斷是否等于0問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • C語言中的運算符和結合性問題

    C語言中的運算符和結合性問題

    這篇文章主要介紹了C語言中的運算符和結合性問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • opencv提取水平與垂直線條

    opencv提取水平與垂直線條

    這篇文章主要為大家詳細介紹了opencv提取水平與垂直線條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++應用Eigen庫對應實現matlab中部分函數問題

    C++應用Eigen庫對應實現matlab中部分函數問題

    這篇文章主要介紹了C++應用Eigen庫對應實現matlab中部分函數問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論