string(const string& str);//1
string(const char*s);//2
string(int n,char c);//3
int main()
{
string str;
string str2(str);//1
string str3 = "abc";//2
string str4(10,'a');//3 10个字符a
}
有两种方式,一种就是通过**=**来赋值,另一种就是通过assign()来赋值。
void test01()
{
string str;
str = "abc";//abc
str.assign("abc");//abc
str.assign("abc", 1);//a
string str2;
str2.assign(str);//a
str2.assign(5, 'a');//aaaaa
str2.assign("abc", 0, 2);//ab 从0号位置开始去,拿走两个
//cout << str << endl;
cout << str2 << endl;
}
int main()
{
test01();
return 0;
}
string str = "abcd";
//如何获得字符串长度进而打印字符串呢?是不能使用strlen()的,这个函数的参数是char*而不是string。
//string中专门维护着求字符串长度的方法
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) << " ";//用at()函数
}
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;//系统打印的结果invalid string position
}
/*
catch(...)
{
cout<<"捕获到了异常"<
return 0;
}
int main()
{
string str1 = "I LOVE ";
string str2 = "YOU";
//str1 += str2;
str1.append(str2);
return 0;
}
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);
//从下标为1的地方开始寻找@,这个用的比较多。
int main()
{
string str = "abcdefgc";
str.replace(1, 3, "1111");//替换从1开始的3个字符为"1111";
cout << str << endl;
return 0;
}
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;
}
int main()
{
string str = "abcd";
string str2 = str.substr(0, 3);//返回由下标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;
}
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");//在指定的下标位置前插入字符串:h111ello
str.erase(1, 3);//删除从下标位置开始的3个字符(包括下标位置):hello
return 0;
}
int main()
{
const char* str = "abcd";
//将const chat* 转为 string
string s(str);//有参构造
cout << s << endl;
return 0;
}
int main()
{
string str = "hello";
//将string 转为 const char*
const char* str2 = str.c_str();
return 0;
}
参数类型的转换:
void func(string s)
{
}
int main()
{
const char* str = "hello";
func(str);
return 0;
}
//以上写法是没有错的,const char*可以隐式转换为string
void func2(const char * s)
{
}
int main()
{
string str = "hello";;
func2(str);
return 0;
}
//以上的写法就会报错。string不能隐式类型转换为const char*
string类中是维护着已给const char*的。某种意义上,string>const char *
就是将所有的字符都变成大写。
需要使用toupper()函数
int main()
{
string str = "abcDeF";
for (int i = 0; i < str.size(); i++)
{
str[i] = toupper(str[i]);
//如果是大写变小写:str[i] = tolower();
}
cout << str << endl;
return 0;
}
如果是大写变小写,需要使用tolower()函数
如果想修改string字符串的内容,那么如果使用[ ]和 at( )返回字符的引用(准备用引用修改值),然后才能修改。但是如果当字符串的内存被重新分配了以后,可能会发生错误。