目录结构:
标准库类型string表示可变长的字符序列,使用string类型必须首先包含string头文件,作为标准库的一部分string定义在标准库std中。
#include <string>//引用头文件 using std::string;
1.定义和初始化string
如何初始化类由类本身决定,一个类可以定义多种初始化对象的方式。
string s1;//默认初始化 string s2(s1);//s2是s1的副本 string s2 = s1;//等价于s2(s1),s2是s1的副本 string s3("value");//s3是字面值"value"的副本,除了字面值最后的那个空字符外 string s3 = "value";//等价于s3("value"),s3是字面值"value"的副本 string s4(n,'c');//把s4初始化为由连续n个字符'c'组成的串
2.string对象上的操作
一个类除了要规定初始化其对象的方式外,还要定义对象上所能执行的操作。下面是string对象的大多数操作。
os << s //将s写到输出流os当中,返回os is >> s //从输入流is中读取字符串赋给s,字符串以空白分割,返回is getline(is,s) //从is中读取一行赋给s,返回is s.empty() //s为空返回true否则返回false s.size() //返回s中字符的个数 s[n] //返回s中第n个字符的引用,位置n从0开始 s1+s2 //返回字符串s1和s2连接后的结果 s1=s2 //用s2的副本代替s1中原来的字符 s1==s2 //如果字符串s1和字符串s2中的字符完全一样,则返回true,否则为false s1!=s2 //如果字符串s1和字符串s2中的字符不一样,则返回true,否则返回false <,<=,>,>= //利用字符在字典中的顺序进行比较,且对字母的大小写敏感
下面的案例展示部分方法的使用,案例:
#include <iostream> #include <string> using namespace std; int main(){ string s; cout << "请输入: "; cin >> s;//注意:这里以空格分隔,如果想读取整行数据,可以使用getline方法 cout << "你的输入是: "; cout << s << endl; s = "abc"; if(s.empty()) cout << "s是空 "; else cout << "s非空 "; auto size = s.size();//size()函数的返回值是size_type类型,一种无符号整数类型 cout << "s size is: " << size << " "; //使用迭代器循环输出每个字符 for(auto a = begin(s); a!=end(s); a++){ cout << *a << " "; } //使用指针循环输出每个字符 for(char *c = &s[0], c!=&s[s.size()]; c++){ cout << *c << " "; } cout << endl; return 0; }
begin()返回指向首元素的迭代器,end()返回指向尾元素下一元素的迭代器。
由于字符串的size()方法的返回值是size_type类型,一种无符号整数类型,所以如果n是一个负数,那么下面的例子总是成立的s.size() < n,因为n会自动转化为一个较大的无符号值。因此需要判断字符串的大小,应该先把s.size()的类型转化为有符号的整形,然后再和n比较。例如:
#include <string> #include <iostream> using namespace std; int main(){ string s("abc"); int n = -10; cout << (s.size() < n) << " ";//比较失败 int size = s.size();//先将size_type转化为有符号类型 n = -10; cout << (size < n) << " ";//比较成功 cout << endl; return 0; }
输出结果为:
1 0
-10是有符号整形,在和无符号整形比较时候,会自动转化为一个较大的无符号整形(只有负数才会发生转化,正数不会发生)。所以正确的思路应该是,先把无符号整形转化为有符号整形,然后再比较。或是两个都是无符号整形。
3.处理string对象中的字符
在<cctype>头文件中,定义了一系列的标准字符处理函数。<cctype>是C语言头文件ctype.h的版本。
下面列举了一些主要函数:
isalnum(c)//当c是字母或数字时为真 isalpha(c)//当c是字母时为真 isdigit(c)//当c是数字时为真 ispunct(c)//当c是标点符号时为真 isspace(c)//当c是空格时为真 islower(c)//当c是小写字母时为真 isupper(c)//当c是大写字母时为真 tolower(c)//将c转化为小写字母 toupper(c)//将c转化为大写字母
案例:
#include <string> #include <cctype> #include <iostream> using namespace std; int main(){ string str("abc"); for(auto a : str){ cout << a << endl; } for(auto &a : str){ a = toupper(a);//转化为大写 } for(char *c=&str[0]; c!=&str[str.size()]; c++){ cout << *c << endl; } return 0; }
4.C风格字符串
字符串字面值是一种通用结构的实例,这种结构是从c继承而来的C风格字符串(C-style character string),c风格字符串不是一种类型,而是一种约定俗成的写法,按照书写习惯,一般以空字符结束(null terminated),以空字符结尾的意思就是在字符串的最后一个字符后面加上' ',一般利用指针来操作这些字符串。
同时在c++中的<cstring>头文件中,cstring是C语言头文件string.h的C++版本。
strlen(p) //返回p的长度,空字符不计算在内 strcmp(p1,p2) //比较p1和p2的相等性,如果p1==p2,那么返回0。如果p1>p2,那么返回一个正值。如果p1<p2,那么返回一个负值。 strcat(p1,p2) //将p2附加到p1后,返回p1 strcpy(p1,p2) //将p2拷贝给p1,返回p1
在用数组的形式初始化字符数组时,一定要以空字符‘