本節主要學習substr()函數的用法以及在實際工程中的應用。
一般來說,substr有2種用法:
假設:string s = “0123456789”;
string sub1 = s.substr(5); //只有一個數字5表示從下標爲5開始一直到結尾:sub1 = "56789"
string sub2 = s.substr(5, 3); //從下標爲5開始截取長度爲3位:sub2 = "567"
string sbu3 =s.substr(i,j-i);//從下標爲i開始截取長度爲j-i位。
工程應用:利用STL自己實現split 函數(常用,簡單,直觀)
原型: std::vectorstd::string splitString(const std::string &s, const std::string &seperator)
輸入一個字符串,一個分隔符字符串(可包含多個分隔符),返回一個字符串向量。
typedef std::string::size_type string_size;//不知道 string::size_type 的確切類型,但可以知道它是 unsigned 型。size_type 存儲的 string 長度是 int 所能存儲的兩倍
std::vector<std::string> splitString(const std::string &s, const std::string &seperator)
{
std::vector<std::string> result;
string_size i = 0;
while(i != s.size())
{
//找到字符串中首個不等於分隔符的字母;
int flag = 0;
while(i != s.size() && flag == 0)
{
flag = 1;
for(string_size k = 0; k < seperator.size(); k++)//“ ”,空格字符串的大小爲1
{
if(s[i] == seperator[k])//s[0]!=seperator[0],即判斷首字符是否等於“ ”
{
i++;
flag = 0;
break;
}
}
}
//找到又一個分隔符,將兩個分隔符之間的字符串取出;
flag = 0;
string_size j = i;
while(j != s.size() && flag == 0)
{
for(string_size k = 0; k < seperator.size(); k++)
{
if(s[j] == seperator[k])
{
flag = 1;
break;
}
}
if(flag == 0)
j++;
}
if(i != j)
{
result.push_back(s.substr(i, j-i));//從下標爲i開始截取長度爲j-i位
i = j;
}
}
return result;
}
int main(){
string s = "VERTEX2 O 0.5 1 0;
vector<string> v = split(s, " "); //可按空格字符來分隔;
for(vector<string>::size_type i = 0; i != v.size(); ++i)
cout << v[i] << " ";
cout << endl;
}