必须先声明:#include <string>
String和c风格的字符串对比:
1.char *是个指针,string是个类
2.string封装了char *,可以管理这个字符串,是一个char类型的容器
为了管理这个字符串,string封装了很多实用的成员方法:find查找,copy拷贝,delete删除,replace替代,insert插入
3.string不要考虑内存释放和越界
string 管理 char*所分配的内存。 每一次 string 的复制, 取值都由 string 类负责维护, 不用担心复制越界和取值越界等。
常用函数
x.size();//返回x的长度
x.empty();//判断是否为空,空的话返回true
x.clear();//清空
x.substr(n,m);//返回从下标n开始的长度为m的子串,m可以省略,省略后默认到字符串尾部
x.c_str();//返回字符串的起始地址
用法1:char s2[] = x.c_str();
用法2:printf("%s\n",x.c_str());
常用的string运算符:
=、+、+=、==、!=、<、<=、>、>=、[](访问下标对应字符)、>>(输入)、<<(输出)
string字符串读入详解
1.读入字符串,遇空格,回车结束
string s;
cin >> s;
2.读入一行字符串(包括空格),遇回车结束
string s;
getline(cin, s);
注意:getline(cin, s)会获取前一个输入的换行符,所以需要在前面添加读取换行符的语句。如:getchar() 或cin.get()
错误读法:
int n;
string s;
cin >> n;
getline(cin, s); //此时读取相当于读取了前一个回车字符
正确读法:
int n;
string s;
cin >> n;
getchar(); //cin.get()//读取换行符
getline(cin, s);//可正确读入下一行的输入
总结:要特别注意cin与cin.getline()的混用
cin输入完后,回车,cin遇到回车结束输入,但回车还在输入流中,cin并不会清除,导致getline()读取回车,结束。
所以,需要在cin后面加getchar()或cin.get()来将换行符读走
string的所有函数
1.string的构造函数
string();//创建一个空的字符串 例如: string str;
string(const string& str);//使用一个string对象初始化另一个string对象
string(const char* s);//使用字符串s初始化
string(int n, char c);//使用n个字符c初始化
2.string的获取长度操作
int size();//返回string对象的字符个数
int length();//返回string对象的字符个数
int max_size();//重新分配内存之前,string对象能包含的最大字符数
int capacity();//重新分配内存之前,string对象能包含的最大字符数
3.string的基本赋值操作
string& operator=(const char* s);//char*类型字符串 赋值给当前的字符串
string& operator=(const string &s);//把字符串s赋给当前的字符串
string& operator=(char c);//字符赋值给当前的字符串
string& assign(const char *s);//把字符串s赋给当前的字符串
string& assign(const char *s, int n);//把字符串s的前n个字符赋给当前的字符串
string& assign(const string &s);//把字符串s赋给当前字符串
string& assign(int n, char c);//用n个字符c赋给当前字符串
string& assign(const string &s, int start, int n);//将s从start开始n个
4.string的字符的存取
char& operator[](int n);//通过[]方式取字符
char& at(int n);//通过at方法获取字符
[]和at的区别:当下标越界时,[]不会抛出异常,而at会抛出异常
int main() { string str1="sfasf"; try{ //str1[1000]='G';//越界 []不抛出异常 str1.at(1000)='G';//越界 at会抛出异常 } catch(exception &e){ cout<<"异常:"<<e.what()<<endl; } return 0; }
5.字符串拼接
string& operator+=(const string& str);//重载+=操作符
string& operator+=(const char* str);//重载+=操作符
string& operator+=(const char c);//重载+=操作符
尾部
string& append(const char *s);//把字符串s连接到当前字符串结尾
string& append(const char *s, int n);//把字符串s的前n个字符连接到当前字符串结尾
string& append(const string &s);//同operator+=()
string& append(const string &s, int pos, int n);//把字符串s中从pos开始的n个字符连接到当前
字符串结尾
string& append(int n, char c);//在当前字符串结尾添加n个字符c
6.字符串的查找替换
int find(const string& str, int pos = 0) const;//查找 str 第一次出现位置,从 pos 开始查找
int find(const char* s, int pos = 0) const;//查找 s 第一次出现位置,从 pos开始查找
int find(const char* s, int pos, int n) const;//从 pos 位置查找 s 的前 n 个字符第一次位置
int find(const char c, int pos = 0) const;//查找字符 c 第一次出现位置
反向(返回/查找的序号和正向相同,只是查找的方向不同)
int rfind(const string& str, int pos = npos) const;//查找 str 最后一次位置,从 pos 开始查找
int rfind(const char* s, int pos = npos) const;//查找 s 最后一次出现位置,从pos 开始查找
int rfind(const char* s, int pos, int n) const;//从 pos 查找 s 的前 n 个字符最后一次位置
int rfind(const char c, int pos = 0) const;//查找字符 c 最后一次出现位置
替换
string& replace(int pos, int n, const string& str);//替换从 pos 开始 n 个字符为字符串 str
string& replace(int pos, int n, const char* s);//替换从 pos 开始的 n 个字符为字符串 s
大小写替换
tolower(s[i])//转换为小写
toupper(s[i])//转换为大写
7.字符串的比较
int compare(const string &s) const;//与字符串s比较
int compare(const char *s) const;//与字符串s比较
compare函数在>时返回 1,<时返回 ‐1,==时返回 0。
比较区分大小写,比较时参考字典顺序,排越前面的越小。--大写的A比小写的a小。
int main() { string str1="abc"; string str2="bcd"; cout<<str2.compare(str1)<<endl; cout<<str2.compare("bcd")<<endl; return 0; }
8.字符串提取
string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串
案例:将:分割的所有字符串提取出来
int main() { string str="hehehe:ha:xixi:lala:heihei"; int front=0; int back=str.find(':',front); int i=10; while(back<str.size()){ cout<<back<<endl; cout<<str.substr(front,back-front)<<endl; front=back+1; back=str.find(':',front); } cout<<str.substr(front,str.size()-front); return 0; }
9.字符串的插入删除
string& insert(int pos, const char* s); //插入字符串
string& insert(int pos, const string& str); //插入字符串
string& insert(int pos, int n, char c);//在指定位置插入n个字符c
string& erase(int pos, int n = npos);//删除从Pos开始的n个字符
int main() { string str="hello world"; str.insert(5,"hehe"); cout<<str<<endl; str.erase(5,4); cout<<str<<endl; return 0; }
10.string和c风格的字符串转换
string转为c风格字符串:借助c_str( )
c风格字符串转为string:直接转
int main() { string str1;//对象 char *str2 ="hello str"; //将char * 转成 string (直接完成) str1 = str2; cout<<str1<<endl;//hello str string str3="hello str"; //不能直接将string 转换成 char * 必须借助string中的c_str方法完成 //char *str4 = str3;//err char *str4 = const_cast<char *> (str3.c_str()); cout<<str4<<endl;//"hello str3" }