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

C++?分割字符串數(shù)據(jù)的實現(xiàn)方法

 更新時間:2023年09月01日 16:25:32   作者:^@^lemon?tea^@^  
這篇文章主要介紹了C++?分割字符串數(shù)據(jù)的實現(xiàn)方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

C++ 分割字符串數(shù)據(jù)的實現(xiàn)方法

使用stringstream流(已驗證)

引入頭文件

#include <sstream>

功能實現(xiàn):

string keyValue = "WTH01#WTH02#WTH03#WTH04#WTH05"
string keys[6] = { "" };
stringstream is(keyValue);
string temp;
int index = 0;
while (getline(is, temp, '#'))
{
    keys[index] = temp;
    index++;
    cout << temp << endl;
}

結(jié)果圖

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

如:

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

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

一、使用stringstream流

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

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

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

 因此,我們可以按照此方式設計一個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; // 輸出
	}
}

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

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

 以上,我們簡單的設計了一種C++中的分割字符串的函數(shù),下面來看一個測試用例:

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 - 要包含的首個字符的位置 ,count - 子串的長度
返回值
含子串 [pos, pos+count) 的 string 。

由以上兩個函數(shù)我們便可以設計出我們的Stringsplit()來。同時,因為find()函數(shù)查找的可以是字符串,因此我們的分隔符可以是單個的字符,也可以是一個字符串。 

// 使用字符分割
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);
		//去掉已分割的字符串,在剩下的字符串中進行分割
		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);
		//去掉已分割的字符串,在剩下的字符串中進行分割
		strs = strs.substr(pos + step, strs.size());
		pos = strs.find(splits);
	}
}

下面是一個測試用例:

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庫函數(shù)strtok

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

參數(shù):str - 指向要記號化的空終止字節(jié)字符串的指針
delim - 指向標識分隔符的空終止字節(jié)字符串的指針
返回值:指向下個記號起始的指針,或若無更多記號則為空指針。

需要注意的是,該函數(shù)使用一個全局的靜態(tà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());	// 下一個被分割的串
	}
	delete[] strc;
}

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

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

 下面給出一個測試用例,我們分別使用單/雙引號傳入分割的限定字符。

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(正則表達式)

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

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

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

測試用例:

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("ThisABCisABCaABCtest");
	Stringsplit(str2, "ABC", strList2);
	for (auto s : strList2)
		cout << s << " ";
	cout << endl;
}

# 輸出
This is a test
This is a test

到此這篇關于C++ 分割字符串數(shù)據(jù)的文章就介紹到這了,更多相關C++ 分割字符串內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++?內(nèi)存管理深入解析

    C++?內(nèi)存管理深入解析

    C++內(nèi)存管理分棧、堆、全局/靜態(tài)區(qū)等,需手動控制動態(tài)內(nèi)存分配,通過new/delete管理對象生命周期,推薦使用智能指針和RAII原則避免內(nèi)存泄漏、懸空指針等錯誤,確保程序安全高效運行,本文給大家介紹c++內(nèi)存管理的相關知識,感興趣的朋友一起看看吧
    2023-10-10
  • C++ vector的用法小結(jié)

    C++ vector的用法小結(jié)

    這篇文章主要介紹了c++中,vector是一個十分有用的容器,下面對這個容器做一下總結(jié)
    2013-12-12
  • 剖析C++編程當中指針作為函數(shù)參數(shù)的用法

    剖析C++編程當中指針作為函數(shù)參數(shù)的用法

    這篇文章主要介紹了剖析C++編程當中指針作為函數(shù)參數(shù)的用法,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • Matlab實現(xiàn)三維投影繪制的示例代碼

    Matlab實現(xiàn)三維投影繪制的示例代碼

    這篇文章系小編為大家?guī)砹艘粋€三維投影繪制函數(shù)(三視圖繪制),函數(shù)支持三維曲線、曲面、三維多邊形、參數(shù)方程曲線、參數(shù)方程曲面的投影繪制,需要的可以參考一下
    2022-08-08
  • C語言深入講解函數(shù)的使用

    C語言深入講解函數(shù)的使用

    各位小伙伴們,今天YU同學給大家?guī)淼氖桥c函數(shù)相關的知識,本篇將會帶著大家初步認識和調(diào)用函數(shù)來解決一些簡單的問題
    2022-04-04
  • C++中異常機制的實現(xiàn)機制詳解

    C++中異常機制的實現(xiàn)機制詳解

    這篇文章主要給大家介紹了關于C++中異常機制的實現(xiàn)機制的相關資料,文中通過圖文以及示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-06-06
  • 利用Matlab制作一個賊簡單的粒子圣誕樹

    利用Matlab制作一個賊簡單的粒子圣誕樹

    圣誕節(jié)快到了,本文用Matlab繪制了圣誕樹祝你們圣誕節(jié)快樂,所以下面這篇文章主要給大家介紹了關于如何利用Matlab制作一個賊簡單的粒子圣誕樹,需要的朋友可以參考下
    2022-12-12
  • VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法

    VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法

    這篇文章主要介紹了VC實現(xiàn)動態(tài)菜單的創(chuàng)建方法,需要的朋友可以參考下
    2014-07-07
  • 一文讀懂C++中指針和內(nèi)存分配

    一文讀懂C++中指針和內(nèi)存分配

    我們知道聲明的所有變量在內(nèi)存中都有一個特定的地址。聲明一個指針變量來指向內(nèi)存中的這些地址,這篇文章主要介紹了C++中指針和內(nèi)存分配,需要的朋友參考下吧
    2021-06-06
  • c語言線程終止練習示例

    c語言線程終止練習示例

    這篇文章主要介紹了c語言線程終止練習示例,需要的朋友可以參考下
    2014-04-04

最新評論

宁河县| 上林县| 邹城市| 新巴尔虎左旗| 吴堡县| 通化县| 巴林右旗| 厦门市| 浦东新区| 灵川县| 德保县| 鄂托克前旗| 四川省| 林甸县| 昭通市| 香格里拉县| 广昌县| 阿拉善右旗| 马鞍山市| 绥化市| 体育| 雷山县| 深圳市| 清徐县| 张北县| 青阳县| 胶州市| 白银市| 兰考县| 孟津县| 井冈山市| 昌邑市| 黄山市| 凤台县| 绩溪县| 东乡县| 盐边县| 东莞市| 湟中县| 昔阳县| 高邑县|