在一些編程練習中,經常會對字符串進行處理,往往處理之前都會對字符串進行分割來提取各部分信息。在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
感謝您的閱讀!