3.2 标准库类型 string

 string是标准库的一部分

Note:标准库对一应用场合来说有足够的效率。

 

3.2.1 定义和初始化string对象

初始化string对象的方式

 string s1

默认初始化,s1是一个空串

 string s2(s1)

 s2是s1的副本

 string s2  = s1

同上

 string s3(“value ”)

 s3是字面值“value”的副本,除了字面值最后的空字符除外

 string s3 = “value”

同上

 string s4(n,‘c’)

把s4初始化为由n个字符c组成的串

直接初始化和拷贝初始化

 

用 = 初始化一个变量,实际上执行的是 拷贝初始化(copy initialization

不用等号,则执行的是 直接初始化(direct initialization

 

3.2.2 string对象上的操作

 

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个字符的引用,从0开始

 s1+s2

返回s1和s2连接后的结果

 s1=s2

用s2的副本代替s1中原来字符

 s1==s2,s1!=s2

是否完全一样,大小写敏感

 <,<=,>,>=

利用字符在字典中的顺序进行比较,大小写敏感

 

 

读写string对象

 cin >> s; 输入遇到空格时停止

如 HELLO WORLD

输出 HELLO

 cin >> s1 >> s2;

此时输入 “Hello World”

输出将是 HelloWorld

读取未知数量的string对象

 while(cin >> word)

        cout<< word << endl;

用getline读取一整行

getline函数的参数是一个输入流和一个string对象

读入内容直到遇到换行符(换行符也读入)

string不存换行符

 string line;

 while(getline(cin,line))

      cout << line << endl;

Note: 触发getline函数返回的那个换行符实际上被丢弃, 得到的stirng对象中不包含该换行符

string的 empty 和 size操作

略 (见上)

string::size_type类型

 auto len  = line.size();// len的类型是 string::size_type

 Tip 如果有 size()函数就不要使用int,这样可以避免混用intunsigned可能带来的问题

 

比较string对象

如果较短的string对象和较长的string对象相对位置都相同,则前者小于后者

 

为string对象赋值

 

两个string相加

 

字面值和string相加

 

标准库允许把字符字面值和字符串字面值转换成string

 但是 + 的两侧至少有一个对象时string,不能拿字面值直接相加

Warning 字符串字面值与string是不同的类型

 

3.2.3 处理string对象中的字符

 

cctype 头文件中定义了一组 标准库函数处理string

 cctype 头文件中的函数

 isalnum ( c )

当c是字母或数字时为真

 isalpha( c )

当c是字母为真

 iscntrl ( c )

当c是控制字符时为真

 isdigit( c )

当c是数字时为真

 isgraph ( c )

当c不是空格但可打印时为真

......

略(百度)

建议:使用c++版本的c标准头文件

来自C语言的头文件如name.h在c++中将这些文件命名为cname

,前面加c

 

 

处理每个字符?使用基于范围的for语句

c++11提供 范围forrange for

语法是:

for(declaration : expression)

 statement

 expression 部分是一个对象,用于表示一个序列

 declaration 部分负责定义一个变量

每次迭代declaration部分都被初始化为expression的一部分

 string str("some string");

//每行输出str的一个字符。

 for(auto c: str)

  cout << c <<endl;

适用范围for改变字符串中的字符

如果要改变string对象中字符的值,必须把循环变量定义成引用定义

例:

 string s("Hello World!!!");

 //转换成大写形式

 for(auto &c : s)

 c = toupper( c ); //c是引用,因此赋值语句将改变s中字符的值

 cout << s << endl;

 

 只处理一部分字符?

想要访问string对象中的单个字符有两种方式:

一种是使用下标,另一种是使用迭代器

下标运算符( [   ] 接受的是string::size_type类型的值(用decltype很重要)

这个参数表示要访问的字符的位置;返回值是该位置上的字符的引用

 

s[0]是第一个字符

s[s.size()-1]是最后一个字符

Note: string对象下标必须大于0而小于s.size().

使用下标访问空string会引发不也预知的后果

 

如果索引带符号会自动转换成string::size_type

 

使用下标执行随机访问

 string::size_type n;

 while (cin >> n)

......

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值