前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++之旅-string

C++之旅-string

作者头像
编程珠玑
发布2019-09-03 10:42:47
4170
发布2019-09-03 10:42:47
举报
文章被收录于专栏:编程珠玑编程珠玑

前言

标准库类型string表示可变长字符序列,使用之前需要包含string头文件,它定义在命名空间std中。

string初始化

代码语言:javascript
复制
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的初始化等价于下面的语句:

代码语言:javascript
复制
string temp(8,'a');
string s5 = temp;

如果使用=初始化一个变量,执行的是拷贝初始化,编译器把等号右边的初始值拷贝到新创建的对象中,否则为直接初始化

string操作

读写string

可以使用标准库中的iostream来读写string对象。 例如:

代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{
    string s;
    cin >> s;   //将控制台输入存储到s中
    cout<< s << endl; //打印s的内容
    return 0;
}

运行程序,在控制台输入: Hello world。 输入和输出结果如下:

代码语言:javascript
复制
 Hello world
Hello

可以看到,string对象会自动忽略开头的空白(空格符,换行符,制表符等)并从第一个真正的字符开始读起,直到遇到下一处空白。 另外,string对象的输入输出操作会返回运算符左侧运算对象,并将其作为结果:

代码语言:javascript
复制
cin >> s1 >> s2;

也就是说,对于上面的表达式,在运算cin >> s1之后,返回cin,继续运算cin >> s2。最终会将第一个输入读到s1,第二个输入读到s2中。

读取整行

整行读取可以使用getline函数。getline的读取会保留输入时的空白,遇到换行符才结束(换行符也被读取进来了)。遇到空行时,读取到的是空串。

代码语言:javascript
复制
#include<iostream>
using namespace std;
int main()
{
    string line;
    if(getline(cin,line))
    {
        cout<< line;
        cout<< line;
    }
    return 0;
}

输入输出结果:

代码语言:javascript
复制
    HELLO                                                                              
    HELLO    HELLO   

可以看到:

  • 空字符也被读取进来了
  • 换行符没有存储在string中,line两次打印被打印在了同一行
字符串比较

比较s1和s2所含的字符是否完全一样,可以使用下面的方式:

代码语言:javascript
复制
s1 == s2

string的大小比较是利用字符在字典序比较:

代码语言:javascript
复制
s1 > s2
s1 <= s2
判断string对象是否为空串

例如:

代码语言:javascript
复制
s.empty()  //返回布尔类型值
获取string对象长度

例如:

代码语言:javascript
复制
s.size()

注意:这个表达式的返回值类型为string::size_type,它是一个无符号类型,因此避免用有符号类型,例如int来存储或者比较其长度。一个无符号数和一个负的有符号数比较大小时,有符号数会被转换为很大的无符号数,因此常常得到的结果就是这个无符号数小于这个负的有符号数。(可参考C语言入坑指南-整型的隐式转换与溢出

字符串相加

有以下几种方式:

代码语言:javascript
复制
s1 + s2  //返回s1和s2的内容
s1 + “world”  //返回s1和world的内容

注意:字符字面值和string对象使用+运算符时,两侧运算对象至少一个是string。 下面的操作是非法的:

代码语言:javascript
复制
strings s = "hello" + "world"; //非法操作
字符串访问

要访问字符串中的字符,可直接使用下表运算符[],例如:

代码语言:javascript
复制
s[0]   //访问s的第一个字符
s[s.size()-1] //访问s的最后一个字符

遍历字符串,可使用for each:

代码语言:javascript
复制
for(auto c : s)     //遍历s中的字符,每个字符赋给c遍历
    cout << c << endl;  //打印c的值

同样也可以使用常规方式:

代码语言:javascript
复制
unsignen int loop ;
for(loop = 0; loop < s.size();loop++)
    cout << s[loop] << endl;

总结

  • C++中的string是一个对象,但字符串字面值并不是一个string对象
  • string的size函数返回值为无符号类型
  • string对象的比较可用==等操作符,比较的是字符串内容是否相同
  • 两个字符串字面值不能直接使用+操作符
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程珠玑 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • string初始化
  • string操作
    • 读写string
      • 读取整行
        • 字符串比较
          • 判断string对象是否为空串
            • 获取string对象长度
              • 字符串相加
                • 字符串访问
                • 总结
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档