专栏首页编程珠玑C++之旅-string

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对象。 例如:

#include<iostream>
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的读取会保留输入时的空白,遇到换行符才结束(换行符也被读取进来了)。遇到空行时,读取到的是空串。

#include<iostream>
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对象的比较可用==等操作符,比较的是字符串内容是否相同
  • 两个字符串字面值不能直接使用+操作符

本文分享自微信公众号 - 编程珠玑(shouwangxiansheng),作者:守望先生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 文件读写测试,磁盘读写测试全靠它

    有时候需要测试磁盘读写速度,或者临时读写文件,不想临时写代码?有没有测试使用的命令?当然有!

    编程珠玑
  • GDB调试指南-断点设置

    在介绍之前,我们首先需要了解,为什么需要设置断点。我们在指定位置设置断点之后,程序运行到该位置将会“暂停”,这个时候我们就可以对程序进行更多的操作,比如查看变量...

    编程珠玑
  • 如何创建多进程程序?(文末福利)

    在《对进程和线程的一些总结》已经介绍了进程和线程的区别,但是在C/C++中如何创建进程呢?或者说如何编写多进程的程序呢?

    编程珠玑
  • Go 语言基础--strings&strconv 浅析

    string 是日常开发中最常用的一个结构,string 相关工具主要有strings & strconv,本篇就来看看这个两个工具。

    邹志全
  • 游戏思维开发社区问答系统的感受

    大家好,最近在开发社区的问答系统,公众账号文章由于志愿者相继有事情,近期就更新的比较少,请大家见谅。本篇给大家讲讲社区系统的部分功能说明,后面必然开源,。

    李海彬
  • 『Go 内置库第一季:strings』

    这一季的系列主题,主要围绕内置库进行。如果一个人写的代码比你的赞,那么他对内置库的熟悉程度一定比你强。

    谢伟
  • 两条命令助你成为优秀的 YAML 工程师

    我们在编写 Kubernetes 资源清单的时候可能会经常会忘记要创建的资源名称,即使知道了可能也不记得该资源对象有哪些属性可以使用了,特别是对于那些名称很长的...

    我是阳明
  • 对象存储 Node.js SDK cos-nodejs-sdk-v5 Typescript 声明文件

    用到腾讯云对象存储,使用Node.js SDK cos-nodejs-sdk-v5,没有 typescript 的声明文件,自己写了一个。

    苦少
  • Hive 创建和生成Rcfile 和SequenceFile格式的表

    rcfile格式表需要从原始的textfile 文件格式表导出数据并导入到新建好的rcfile格式表里

    sanmutongzi
  • Go基础——字符串

    字符串结构由两个信息组成:第一个是字符串指向的底层字节数组,第二个是字符串的字节的长度。字符串其实是一个结构体,因此字符串的赋值操作也就是reflect.Str...

    羊羽shine

扫码关注云+社区

领取腾讯云代金券