本节主要学习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;
}