C++之旅-string
前言
标准库类型string表示可变长字符序列,使用之前需要包含string头文件,它定义在命名空间std中。
string初始化
string s1 //默认初始化,s1是一个空串
string s2(s1) //S2是s1的副本
string s2 = s1 //等价于s2(s1)
string s3 = ("hello") //s3是“hello”的副本,但不包含最后的空字符
string s3("hello") //等价于s3 = ("hello")
string s4(n,'c') //s4初始化为连续n个c字符组成的串
其中string s4的初始化等价于下面的语句:
string temp(8,'a');
string s5 = temp;
如果使用=初始化一个变量,执行的是拷贝初始化,编译器把等号右边的初始值拷贝到新创建的对象中,否则为直接初始化。
string操作
读写string
可以使用标准库中的iostream来读写string对象。
例如:
using namespace std;
int main()
{
string s;
cin >> s; //将控制台输入存储到s中
cout<< s << endl; //打印s的内容
return 0;
}
运行程序,在控制台输入: Hello world。
输入和输出结果如下:
Hello world
Hello
可以看到,string对象会自动忽略开头的空白(空格符,换行符,制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白。
另外,string对象的输入输出操作会返回运算符左侧运算对象,并将其作为结果:
cin
s1 >> s2;也就是说,对于上面的表达式,在运算cin >> s1之后,返回cin,继续运算cin >> s2。最终会将第一个输入读到s1,第二个输入读到s2中。
读取整行
整行读取可以使用getline函数。getline的读取会保留输入时的空白,遇到换行符才结束(换行符也被读取进来了)。遇到空行时,读取到的是空串。
using namespace std;
int main()
{
string line;
if(getline(cin,line))
{
cout<< line;
cout<< line;
}
return 0;
}
输入输出结果:
HELLO
HELLO HELLO
可以看到:
空字符也被读取进来了
换行符没有存储在string中,line两次打印被打印在了同一行
字符串比较
比较s1和s2所含的字符是否完全一样,可以使用下面的方式:
s1 == s2
string的大小比较是利用字符在字典序比较:
s1 > s2
s1 <= s2
判断string对象是否为空串
例如:
s.empty() //返回布尔类型值
获取string对象长度
例如:
s.size()
注意:这个表达式的返回值类型为string::size_type,它是一个无符号类型,因此避免用有符号类型,例如int来存储或者比较其长度。一个无符号数和一个负的有符号数比较大小时,有符号数会被转换为很大的无符号数,因此常常得到的结果就是这个无符号数小于这个负的有符号数。(可参考C语言入坑指南-整型的隐式转换与溢出)
字符串相加
有以下几种方式:
s1 + s2 //返回s1和s2的内容
s1 + “world” //返回s1和world的内容
注意:字符字面值和string对象使用+运算符时,两侧运算对象至少一个是string。
下面的操作是非法的:
strings s = "hello" + "world"; //非法操作
字符串访问
要访问字符串中的字符,可直接使用下表运算符[],例如:
s[0] //访问s的第一个字符
s[s.size()-1] //访问s的最后一个字符
遍历字符串,可使用for each:
for(auto c : s) //遍历s中的字符,每个字符赋给c遍历
cout << c << endl; //打印c的值
同样也可以使用常规方式:
unsignen int loop ;
for(loop = 0; loop < s.size();loop++)
cout << s[loop] << endl;
总结
C++中的string是一个对象,但字符串字面值并不是一个string对象
string的size函数返回值为无符号类型
string对象的比较可用==等操作符,比较的是字符串内容是否相同
两个字符串字面值不能直接使用+操作符
关注公众号【编程珠玑】,第一时间获取更多原创技术文章