标准库string类
string 表示可变长度的字符序列
字符串是对象
string 类支持字符串对象的各种操作:
1、各种初始化方式
2、字符串之间的复制、比较、连接
3、查询字符串长度和判断字符串是否为空
4、访问字符串中的单个字符
使用string 类要包含头文件
初始化string对象的方式:
1、string s1 //默认初始化,s1是一个空串
2、 string s2(s1) //s2是s1的一个副本
3、string s2=s1 //等价于 string s2(s1)
4、string s3(“value”) //s3是字面值“value"的副本,除了字面值最后的空字符外
5、string s3=“value” // 等价于s3(“value”)
6、string s4(n,‘c’) // 把s4初始化为由连续n个字符c组成的串
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开始
s.c_str() 转换,返回s中内容对应的c风格字符串的首地址
s1=s2 赋值,用s2的副本替换s1原来的内容
s1+s2 连接,返回s1和s2连接后的内容
s1+=s2 追加,把s2的内容追加到s1的后面
s1==s2 如果s1和s2的内容完全相同,则相等
s1!=s2 string对象的比较对字符区分大小写
<,<=,>,>= 利用字符在字典中的顺序进行比较,区分大小写
可以用循环读取未知数量的string对象
输入操作符返回输入流对象,如果输入流对象处于有效状态,表示没有遇到文件结束或非法输入
//读取输入流中的单词,直到文件结束
string word;
while(cin >> word)
cout << word << endl;
getline()函数:
两个参数:输入流对象和存放读入字符串的string对象
从指定输入流中读取内容,遇到换行符为止;将所读内容存入指定的string对象中,流中的换行符被读取并丢弃
返回参数输入流对象
//每次读取一行文本,直到文件结束
string line;
while(getline(cin, line))
cout << line << endl;
判断stirng对象是否为空
empty()函数判断string对象是否为空,返回一个布尔值
stringObj.empty()
//每次读取一行文本,输出非空的行
string line;
while(getline(cin, line))
if(!line.empty()) //line不为空,输出
cout << line << endl;
获取string对象的长度
size()函数返回string对象的长度,即对象中字符的个数
返回的长度是string::size_type类型
//每次读取一行文本,输出长度超过80个字符的行
string line;
while(getline(cin, line))
if(line.size() > 80)
cout<<line<<endl;
//字符串长度的类型
string line = "hello";
string::size_type len1 = line.size();
auto len2 = line.size();
decltype(line.size()) len3 = 0;
比较string对象:
可以用关系运算符比较两个字符串对象
两个string相等意味着它们的长度相同,并且所包含的字符也完全相同
string s1 = "hello";
string s2 = "hello world"; // s2 > s1
string s3 = "Hello"; // s3 < s1, s3 < s2
string对象的赋值和连接
允许把一个string对象的值赋给另一个string对象
也可以为string对象赋一个字符串字面值常量
string s1 = "hello", s2;
s2 = s1;
s1 = "C++ Programming Language";
两个字符串可以直接用运算符“+”连接,结果得到一个新的string对象,"+"运算符要求至少有一个运算对象是string
复合赋值运算符“+=”则将右操作数的内容追加到左操作数的后面
string s1 = "hello, ", s2 = "world! " ;
string s3 = s1 + s2;
s1 += s2;
string s4 = s1 + "\n"; //正确
string s5 = "hello" + "\n"; //错误
string s6 = s1 + " world" + "\n"; //正确
string s5 = "hello" + "," + s2; //错误
string对象和C风格字符串
字符串字面值不是string类型,而是const char类型
string对象和C风格字符串的转换
可以将C风格的字符串直接赋给string对象,反之不可
用string对象的c_str()操作可以返回一个表示该string对象内容的C风格字符串,结果为const char类型,即C风格字符串的首地址
string s1 = "If you really want it.";
int x = strlen(s1); //Error
x = strlen(s1.c_str()); //OK
处理string对象中的字符
使用下标运算符可以获取string对象中指定位置的字符
可以使用for循环或range for逐个处理string对象中的字符
头文件中定义了一组获取或改变字符特性的标准库函数
随机访问string中的字符
用下标运算符可以访问string对象中指定位置的字符
string对象s的下标范围从0到s.size-1
//将s中的第一个词改成大写形式
string s = "Hello, World!";
int index = 0;
while (index != s.size() && !isspace(s[index])) {
s[index] = toupper(s[index]);
++index;
}
cout << s << endl; //输出:HELLO, World!