3.1标准库类型string

标准库类型String

string表示可变长的字符序列,使用string要包含头文件,string定义在命名空间std中。

1.定义和初始化string

类对象如何初始化是由类本身决定的(各种构造函数决定)。 下面介绍string对象的初始化方式:

  • 默认初始化:默认初始化是调用string类的默认构造函数初始化
string s1; //默认初始化,s1是一个空字符串
  • 拷贝初始化:拷贝初始化是调用string类的拷贝构造函数初始化
string s2(s1); //拷贝初始化,用s1的值初始化s2,等价于如下2:
string s3 = s1; //拷贝初始化等价形式
  • 直接初始化:直接初始化是调用string类的有参构造函数进行初始化
string s4("abc"); //直接初始化,s4的内容为"abc"
string s5(10,'c');//直接初始化,s5的内容为10个'c'
  • 列表初始化:
string s6{"abc"}; //s6的内容是"abc"
string s7={"abc"}; //s7的内容也是"abc"
//s6 s7等价于s4的直接初始化
  • 值初始化
string s8();  //错误。
string s9{};  //值初始化为0

2.string对象上的操作

一个类除了要规定初始化对象的方式(构造函数),还要定义对象上所能执行的操作。

2.1string对象上的操作

string对象上有如下操作:

  • os<<s 将s写到输出流os中,返回os
  • is>>s 从is中读取字符串赋值给s,字符串以空白分隔,返回is
  • getline(is,s) 从is中读取一行赋给s,返回is
  • s.empty() s为空返回true
  • s.size() 返回s中字符的个数
  • s[n] 返回s中第n个字符的引用,位置n从0记起
  • s1+s2 返回s1和s2连接后的结果
  • s1=s2 用s2的副本替代s1中原来的字符
  • s1==s2 判断s1和s2是否相等,相等返回true
  • s1!=s2 等性判断对字母的大小写敏感
  • <,<=,>,>= 利用字符在字典中的顺序进行比较,且对字母的大小写敏感

①string::size_type类型

size函数和下标运算符返回的是一个string::size_type类型,string::size_type是一个无符号整型而且足够放下任何string对象的大小,以用来兼容不同机器,体现标准库类型与机器无关的特性。关于string::size_type有几个需要注意的点:

  • string::size_type是无符号类型,要避免与有符号数int混用,混用有符号数和无符号数可能出错。
  • string::size_type可以和有符号数进行转换。 如:
int len = s.size(); //string::size_type转换成int类型
int i=10;
s[i]; //有符号类型int转换成string::size_type类型                 

②字符串字面值类型

字符串字面值本质是字符数组,以‘\t’结束。切记,**字符串字面值与string是不同的类型。**string类关于字符串字面值的操作:

//1.赋值和初始值操作
string s1("abc"); //初始化
string s2;
s2="abc"; //赋值
//2.+操作
string s3=s1+"efg";
//3.+=操作
string s3+="hij";

2.2string对象中的字符的操作

我们经常需要单独处理string对象中的字符,比如检查一个string对象中是否包含空白,或者把string对象中的字母改成小写等…

这类操作的关键是如何获取字符本身,有时需要处理对象中的每一个字符,另外一些时候只需要处理某个特定的字符。

①在cctype头文件中定义了一组标准库函数处理单个字符

  • isalnum© 当c是字母或数字是为真
  • isalpha© 当c是字母是为真
  • isdigit© 当c是数字时为真
  • islower© 当c是小写字母是为真
  • isspace© 当c是空白时为真
  • is upper© 当c时大写字母为真
  • tolower© 如果c时大写字母,输出对应小写字母,否则原样输出c
  • toupper© 如果c是小写字母,输出对应的大写字母,否则原样输出c

②利用范围for语句处理每个字符

范围for循环遍历给定序列中的每个元素对序列中的每个值执行某种操作,其语法形式是:

for (declaration:expression) {
    statement
}

其中,expression是一个序列对象,如vector或string对象。declaration表示一个变量,用于访问序列中元素statement表示对这个对象进行的某种操作。

如:把string对象中的元素全部打印出来

string s("abcd");
for (char c : s) {
    cout << c<< " ";
}
打印结果为:a b c d 

又如:将s中的小写字符全变成大写字符

string s("akzzzz");
for (auto &c : s) {
    c=toupper(c); //c是一个引用,因此赋值语句将改变s中字符的值
    cout << c ;
}

③利用下标运算符处理某个字符

使用下标运算符时有两个条件:

  • string对象不为空,因此每次使用下标运算符之前需要判断对象不为空
  • 下标大于等于0且小于size(),超出范围下标将引发不可预知的结果

例:输入i,利用下标运算符将的字符串的第i个字符改成小写形式:

string s{"ABCDEFG"};
int i;
cin>>i;
if (!s.empty() && i >= 0 && i < s.size()) {
    s[5] = tolower(s[5]);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值