string容器
构造函数(创建string)
string(const string& str);
string(const char*s);
string(int n,char c);
int main()
{
string str;
string str2(str);
string str3 = "abc";
string str4(10,'a');
}
赋值(’=’ 和 assign())
有两种方式,一种就是通过**=**来赋值,另一种就是通过assign()来赋值。
void test01()
{
string str;
str = "abc";
str.assign("abc");
str.assign("abc", 1);
string str2;
str2.assign(str);
str2.assign(5, 'a');
str2.assign("abc", 0, 2);
cout << str2 << endl;
}
int main()
{
test01();
return 0;
}
存取([ ] 和 at( ))
string str = "abcd";
int length = str.size()
int main()
{
string str = "abcde";
int length = str.size();
cout << length << endl;
for (int i = 0; i < length; i++)
{
cout << str[i] << " ";
cout << str.at(i) << " ";
}
return 0;
}
用两种方法都可以索引到相应的数据
区别:如果使用[ ]不小心越界,那么会直接挂掉;如果使用at(),不会直接挂掉,而是抛出一个异常(out_of_range).
如果使用中括号,如果出错,使用try,catch也不会捕获到异常,而是直接挂掉。
int main()
{
string str = "12345";
try
{
cout << str.at(100) << endl;
}
catch (out_of_range e)
{
cout << e.what() << endl;
}
return 0;
}
拼接(+= 和 append())
int main()
{
string str1 = "I LOVE ";
string str2 = "YOU";
str1.append(str2);
return 0;
}
查找(find())
int main()
{
string str = "abcdefg";
cout << str.find("de") << endl;
return 0;
}
int main()
{
string str = "abcdefg";
int pos = str.find("cd");
if (pos == -1)
{
cout << "没有找到" << endl;
}
else
{
cout << "下标位置是:" << pos << endl;
}
return 0;
}
如果是rfind() ,就是从右往左找到符合的字符,然后再输出其下标(下标是不变的)。正常情况下rfind和find的用法是一样的 ,但是如果有同样满足的字符的时候,距离左边近的就用find,距离右边近的就用rfind。
int pos = str.find('@',1);
替换(replace())
int main()
{
string str = "abcdefgc";
str.replace(1, 3, "1111");
cout << str << endl;
return 0;
}
比较(compare())
int main()
{
string str = "abcd";
string str2 = "abcd";
if (str.compare(str2) == 0)
{
cout << "字符串相等" << endl;
}
else if (str.compare(str2) > 0)
{
cout << "str字符串比较大" << endl;
}
else if (str.compare(str2) < 0)
{
cout << "str2字符串比较大" << endl;
}
return 0;
}
字串(substr)
int main()
{
string str = "abcd";
string str2 = str.substr(0, 3);
return 0;
}
来个小例题:从电子邮件中将用户名截出来。(zhangsan@outlookcom 中截出zhangsan)
int main()
{
string str = "zhangsan@outlookcom";
int pos = str.find('@');
string substr = str.substr(0, pos);
cout << substr << endl;
return 0;
}
上面内容总结:解析字符串
例题:将字符串ww.baidu.com.cn中的单词ww baidu com cn截取到vector容器中。
int main()
{
string str = "ww.baidu.com.cn";
vector<string> v;
int start = 0;
int pos = -1;
while (true)
{
pos = str.find('.',start);
if (pos == -1)
{
string substr2 = str.substr(start, str.size() - start);
v.push_back(substr2);
break;
}
string substr1 = str.substr(start, pos-start);
start = pos + 1;
v.push_back(substr1);
}
for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *it << endl;
}
return 0;
}
插入和删除操作(insert(),erase())
string& insert(int pos,const char* s);在指定位置插入字符串
string& insert(int pos,const char* s);在指定位置插入字符串
string& insert(int pos,int n, char c);在指定位置插入n个c字符
string& erase(int pos,int n );从指定位置开始删除n个字符
int main()
{
string str = "hello";
str.insert(1, "111");
str.erase(1, 3);
return 0;
}
string和c-style字符串转换
int main()
{
const char* str = "abcd";
string s(str);
cout << s << endl;
return 0;
}
int main()
{
string str = "hello";
const char* str2 = str.c_str();
return 0;
}
参数类型的转换:
void func(string s)
{
}
int main()
{
const char* str = "hello";
func(str);
return 0;
}
void func2(const char * s)
{
}
int main()
{
string str = "hello";;
func2(str);
return 0;
}
string类中是维护着已给const char*的。某种意义上,string>const char *
小写变大写(toupper() / tolower())
就是将所有的字符都变成大写。
需要使用toupper()函数
int main()
{
string str = "abcDeF";
for (int i = 0; i < str.size(); i++)
{
str[i] = toupper(str[i]);
}
cout << str << endl;
return 0;
}
如果是大写变小写,需要使用tolower()函数
小提示
如果想修改string字符串的内容,那么如果使用[ ]和 at( )返回字符的引用(准备用引用修改值),然后才能修改。但是如果当字符串的内存被重新分配了以后,可能会发生错误。
|