2021-02-10

如何处理指定的一部分字符

​   要想访问string对象中的单个字符有两种方式:种是使用下标, 另外种是使用迭代器,其中关于迭代器的内容将在3.4节(第95页)和第9章中介绍。

  ​ 下标运算符([ ])接收的输入参数是string::size_ type 类型的值(参见3.22节,第79页),这个参数表示要访问的字符的位置:返回值是该位置上字符的引用。

  ​ string对象的下标从0计起。如果string对象s至少包含两个字符,则s[0]是第1个字符、s[1]是第2个字符、s[s.size()-1]是最后一个字符。

  string对象的下标必须大于等于0而小于s.size()。

  使用超出此范围的下标将引发不可预知的结果,以此推断,使用下标访问空string也会引发不可预知的结果。

  下标的值称作“下标”或“索引”,任何表达式只要它的值是一个整型值就能作为索引。不过,如果某个索引是带符号类型的值将自动转换成由string::size_ type (参见2.1.2节,第33页)表达的无符号类型。

  下面的程序使用下标运算符输出string对象中的第一个字符:

if (!s. empty())	//确保确实有字符需要输出

cout << s[0] << endl;	//输出s的第一个字符

​   在访问指定字符之前,首先检查s是否为空。其实不管什么时候只要对string对象使用了下标,都要确认在那个位置上确实有值。如果s为空,则s[0]的结果将是未定义的。

​   只要字符串不是常量(参见2.4节,第53页),就能为下标运算符返回的字符赋新值。例如,下 面的程序将字符串的首字符改成了大写形式:

string s ("some string") ;

if (!s.empty() )	//确保s[0]的位置确实有字符

s[0] = toupper (s[0]) ;	//为s的第一个字符赋一个新值

  程序的输出结果将是:

Some string

使用下标执行迭代

  ​ 另一个例子是把s的第个词改成大写形式:

//依次处理s中的字符直至我们处理完全部字符或者遇到一个空白

for(decltype(s.size()) index = 0;

index != s.size() && !isspace(s[index]); ++index)

s[index] = toupper (s[index]); //将当前字符改成大写形式

  程序的输出结果将是:

SOME string

​   在上述程序中,for循环使用变量index作为s的下标,index 的类型是由decltype关键字决定的。首先把index初始化为0,这样第一次迭代就会从s的首字符开始:之后每次迭代将index加1以得到s的下一个字符。循环体负责将当前的字母改写为大写形式。

  ​ for语句的条件部分涉及点新知识,该条件使用了逻辑与运算符 (&&)。如果参与运算的两个运算对象都为真,则逻辑与结果为真;否则结果为假。对这个运算符来说最重要的一点是,C++语言规定只有当左侧运算对象为真时才会检查右侧运算对象的情况。如此例所示,这条规定确保了只有当下标取值在合理范围之内时才会真的用此下标去访问字符串。也就是说,只有在index达到s.size()之前才会执行s[index]。随着index的增加,它永远也不可能超过s.size()的值,所以可以确保index比s.size()小。

​   提示:注意检查下标的合法性

  ​ 使用下标时必须确保其在合理范围之内,也就是说,下标必须大于等于0而小于字符串的size()的值。一种简便易行的方法是,总是设下标的类型为string::size_ type, 因为此类型是无符号数,可以确保下标不会小于0。此时,代码只需保证下标小于size()的值就可以了。

​   C++标准并不要求标准库检测下标是否合法。一旦使用了一个超出范围的下标,就会产生不可预知的结果。

使用下标执行随机访问

  ​ 在之前的示例中,我们让字符串的下标每次加1从而按顺序把所有字符改写成了大写形式。其实也能通过计算得到某个下标值,然后直接获取对应位置的字符,并不是每次都得从前往后依次访问。

​   例如,想要编写个程序把0 到15之间的十进制数转换成对应的十六进制形式,只需初始化一个字符串令其存放16个十六进制“数字”:

const string hexdigits = "0123456789ABCDEF"; //可能的十六进制数字

cout << "Enter a series of numbers between 0 and 15"

<< " separated by spaces. hit ENTER when finished: "

<< endl;

string result;//用于保存十六进制的字符串

string: :size_ type n;//用于保存从输入流读取的数

while (cin >> n)

if (n < hexdigits.size() )//忽略无效输入

result += hexdigits[n]; // 得到对应的十六进制数字
cout << "Your hex number is: ”<< result << endi;

​   假设输入的内容如下:

​ 12 0515815

​   程序的输出结果将是:

​ Your hex number is: C05F8F

​   上述程序的执行过程是这样的:首先初始化变量hexdigits令其存放从0到F的十六进制数字,注意我们把hexdigits声明成了常量(参见2.4节,第53页),这是因为在后面的程序中不打算再改变它的值。在循环内部使用输入值n作为hexdigits的下标,hexdigits[n]的值就是hexdigits内位置n处的字符。例如,如果n是15,则结果是F:如果n是12,则结果是C,以此类推。把得到的十六进制数字添加到result内,最后一并输出。

​   无论何时用到字符串的下标,都应该注意检查其合法性。在上面的程序中,下标n是string::size_ type 类型,也就是无符号类型,所以n可以确保大于或等于0。在实际使用时,还需检查n是否小于hexdigits的长度。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值