第三章 字符串(下) 操作字符

本文详细介绍了如何在C++中处理string对象中的字符,包括单个字符操作、cctype头文件中的字符判断函数以及处理字符串中全部元素、部分元素的方法。通过实例展示了如何统计字母、大小写字母和非字母字符,以及字符的大小写转换。
摘要由CSDN通过智能技术生成

目录

3.3 字符串操作

一、处理string对象中的字符

1.单个字符操作

2.cctype头文件中对字符的一些操作(一部分)和几个例题

1)处理字符串中全部元素

2)处理字符串中部分元素

最后


3.3 字符串操作

一、处理string对象中的字符
1.单个字符操作

无论是判断字符串内字符是否是空白或字母或其他,还是将字符串内的字符从大写转换成小写,我们都需要将字符串内的字符一个个取出来。

我们可以很自然的想到用遍历操作每个位置的字符,尝试用for循环:

语法形式是:

for (declaration : expression)

     statement

其中,declaration是定义一个变量访问序列基础元素,expression是要操作的序列;statement则是接下来要进行的操作。

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl;
using std::string;
 int main()
 {
 	string s ; 
 	cin >> s;
 	for (auto c : s )
 	    cout << c << endl;
 	return 0;
 }

上述代码是输入一个字符串,用for循环输出单个字符。我们看一下for循环内部,定义了一个c(auto让编译器决定变量c的类型)去遍历字符串s中的基础元素,并执行操作:输出c和回车。大家可以自己试一试,当然也可以直接初始化一个字符串s,不需要再输入数据。

2.cctype头文件中对字符的一些操作(一部分)和几个例题
                        isdigit()              判断是否是字母
                       isalnum()              判断是否是数字
                        islower()           判断是否是小写字母
                        isupper()           判断是否是大写字母
                        isgraph()       判断是否是空非空执行操作
                         iscntrl()            判断是否为控制字符
                         ispunct()           判断是否为标点符号
                         tolower()   当字符是大写字母时变成小写字母
1)处理字符串中全部元素

举第一个例子,计算输入字符串中分别有多少个大写字母,小写字母和其他字符(当然也可以统计其他的,大家可以自己尝试)。

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl;
using std::string;
 int main()
 {
 	string s ; 
 	cin >> s;
 	int d = 0 , x = 0 , el = 0 , ans = 0;
 	for (auto c : s )
 	   {
 	   	++ans;
 	   	 if(islower(c))
 	   	    //cout << char(toupper(c));
 	   	    ++x;
	    else if (isupper(c))
	        //cout << char(tolower(c)); 
	        ++d;
	        else
	        ++el; 
	        //cout << " ";
		}
	cout << "总共有" << ans << "个" << endl << "其中大写字母有: " << d << " 个 " << endl
	<<"其中小写字母有:" << x << " 个 " << endl << "其他字符有" << el << " 个 " << endl;
 	return 0;
 }

第二个例子:完成字符串中字符的大小写转换(使大小写位置对应),并过滤非字母字符

注意:改变string对象内字符的值,必须把循环变量定义成引用类型。我们在前面引用中说过,是定义一个变量让其绑定元素对象,改变引用变量其实是改变它背后的对象。

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::string;
using std::string;
int main()
{
	string s;
	while (getline(cin , s))//读入有效行
	{
		for (auto &c : s)//定义引用类型去遍历输入的字符串
		    {
		    	if (islower(c))//如果是小写字符
		            {
					    c = toupper(c);	//变成大写
					    cout << c;  //输出
					}
				else if (isupper(c)) //如果是大写字符
				{
				    c = tolower(c); //变成小写字符
					cout << c; //输出
				}
				else //啥也不是的其他字符
				cout << " "; //在这里可以让他们输出空格保证其他字符的对应      	
			}
			    //cout << s << endl;	       
	}
	return 0;
}
2)处理字符串中部分元素

访问字符串中的元素有两种方法:下标(索引)和迭代器

首先,我们用下标定位方法处理部分元素。注意:在处理元素之前先要判断该位置是否有值,有则进行下一步操作,无则是未定义的。在这里,我们介绍一个新的关键字:decltype。

decltype与auto类似,作用在于编译时的类型推导。但两者不同的地方在于:auto从声明初始化表达式中获取类型;而decltype则是以普通表达式作为参数返回表达式的类型而不会自动求值

 使用下标进行迭代:

#include<iostream>
#include<string>
using std::cin ; using std::cout ; using std::endl;
using std::string;
int main()
{
	string s;
	cin >> s;
	for (decltype (s.size()) index = 0;
	    index != s.size() && !isspace (s[index]); ++index)
	        {
		     	s[index] = toupper(s[index]);
			    cout << s[index];
	        }
	return 0;
}

最后

以上是学习C++的笔记,接下来会融合侯捷老师的《STL源码剖析》对C++进行进一步的学习。如果有蓝桥杯等比赛的朋友们可以着重关注一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C.G.道枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值