1. 程式人生 > >c++ 中字串split函式

c++ 中字串split函式

寫這個只是用來記憶一下,時至今日才發現c++ 的cstring類中已經有了字串分split的函式,自己一直沒有發現,羞愧難當,不過還好我是一個知恥後勇的人,既然今天發現了,那就記下來。
cstring中有一個strtok_s函式,它是一個分割字串安全函式,其函式原型如下:

char *strtok_s( char *_String, const char *_Delimiter, char **_Context); 

// _String是帶分割的字串陣列的首地址
// _Delimiter是分割字串的字元集合,可以是單個字元,也可以是字元集合
// _Context是一個上下文字元指標的指標,每次對_String進行處理之後將剩餘字元儲存在_Context指向的位置中,保證執行緒安全

c++中一般儲存字串使用string型別,而strtok_s中需要的是char的變數,string中呼叫c_str()或者data()成員函式返回的是const char, 不能作為strtok_s中第一個變數的輸入,怎麼辦呢?
我們只能使用const_cast,它能給一個變數增加const屬性,也可以刪除一個變數的const屬性,於是我們可以使用const_cast去掉const屬性。
示例程式碼如下。示例程式碼將str中的字串,用空格進行分割後放入到strVec中。
這裡需要說明的時,如果_Delimiter是字元集合的話,表示對_String進行分割,分割後的每一個子字串都不含有_Delimiter中的任何一個字元。

	#include<cstring>
	#include<vector>
	#include<string>
	using namespace std;
	int main(){
		string str = "HELLO WORLD, I。。。 AM GOING TO A NEW REALM";
		vector<string> strVec;
		string delimiter = " ,。";
		char *context;
		char *p = strtok_s(const_cast<char*>(str.data()
), delimiter.data(), &context); for (p; p!= nullptr; p = strtok_s(nullptr, delimiter.data(),&context)) { char tmp[100]; sprintf_s(tmp,100, "%s ",p); strVec.push_back(string(begin(tmp),end(tmp))); } for (auto&e : strVec) printf("%s \n", e.data()); return 0; }

還是不得不感慨一下,c++和python相比,一個split,居然就要多寫6行的程式碼,給跪了。