标准库类型string 表示可变长的字符序列,使用string 类型必须包含string头文件。
#include<string>
using std::string;
一、定义和初始化string对象
String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象。这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似。
string s1 默认初始化,s1是一个空串
string s2(s1) s2是s1 的副本
string s2=s1 等价于s2(s1)
string s3("value") s3是字面值"value"的副本,除了字面值最后的空字符外
string s3 ="value" 等价于s3("value")
string s4(n,'c') 将s4初始化为由连续n个字符c组成的串
string s1,s2;
s1="abc";
s2=s1;
s2="def";
//这样操作之后s1是"abc",s2是"def".
string a="hello,world!";
00000042moveax,dwordptrds:[**02A62208h**]
00000048movdwordptr[ebp-44h],eax
string b="hello,world!";
0000004bmoveax,dwordptrds:[**02A62208h**]
00000051movdwordptr[ebp-48h],eax
string c="hello!";
00000054moveax,dwordptrds:[**02A756F8h**]
0000005amovdwordptr[ebp-4Ch],eax
a的地址指向02A62208h,b的地址也是02A62208h,这说明创建b的时候,.net机制肯定是先去查找内存中是否有这个字符串的内存地址,如果有则指向,没有才创建。
二、string对象上的操作
os<<s 将s写到输出流os当中,返回os
is<<s 从is中读取字符串赋给s,字符串以空白分隔,返回is
getline(is,s) 从is中队去一行赋给s,返回is
s.empty() s为空返回true,否则返回flase
s.size() 返回s中字符的个数
s[n] 返回s中第n个字符的引用,位置n从0计起
s1+s2 返回s1和s2连接的结果
s1=s2 用s2的副本替代s1中原来的字符
s1+=s2 等价于s1=s1+s2
s1==s2 如果s1和s2中所含的字符完全相同,则它们相等;string对象的相等性判断对字母的大小写敏感
s1!=s2
<,<=,>,>= 利用字符在字典中的顺序进行比较,且对字符的大小写敏感
1. 读写string对象
对于string对象可以使用IO操作符读写,在执行读取操作时,string对象会自动忽略开头的空白(即空格符、换行符、制表符等),并从第一个真正的字符开始读起,直到遇到下一个空白为止。
例如:输入" Hello world “(开头,中间和结尾有空格),输出将是"Hello”,没有空格。
读取未知数量的string对象
int main(){
string s;
while(cin >> s){ //反复读取,直到遇到非法输入或文件结束符
cout << s <<endl; //逐个输出,每次输出后,换行
}
return 0;
}
2. 使用getline读取一整行
有时我们希望得到的字符串中保留输入的空白符,这时就应该用getline函数替代原来的>>运算符。
getline函数的参数是一个输入流和一个string对象,函数从给定的输入流中读入内容,直到遇到换行符为止(注意此时换行符也被读进来了),然后把所读的内容存入到string对象中(不存换行符)。getline函数一遇到换行符就结束读取并返回结果。
注意:和输出运算符相同。getline也会返回它的流参数。
int main(){
string s;
while (getline(cin,s)) //每次读入一整行,直至遇到非法输入或文件结束符
cout << s <<endl;
return 0;
}
3.string的size操作
size函数返回string对象的长度(string对象中字符的个数)
size_type类型:size返回的是一个string::size_type类型的值(在类string中定义好的),它是一个无符号的值,而且足够存放任何string对象的大小,所以如果表达式中混有带符号数和无符号数将有可能会产生意想不到的结果
例如:假设n是一个具有负值的int,则表达式s.size() < n的判断结果几乎是true,因为负值n会自动转换成一个比较大的无符号的值。
注意:在C++11中允许编译器通过auto或者decltype来推断变量类型;
auto len = s.size(); //len的类型是string::size_type
4. string 对象相加
string对象可以直接相加。
string s1 = "hello, ",s2="world\n";
string s3 = s1+s2; //s3的内容是"hello, world\n"
s1 +=s2;` //等价于s1 = s1+s2
5. 字面值和string对象相加
当把string对象和字面值相加时,必须确保每一个加法运算符的两侧至少有一个对象为string。
string s1="hello" ,s2="world";
string s3 = s1 +"world"; //正确
string s4 ="hello" + "world" + s2; //错误第一个加号两边没有string对象
注意:C++语言中的字符串字面值并不是标准库string类型的对象,字符串字符值与string是不同的类型