c++如何用迭代器输出大小写字母?

发布于:2022-11-28 ⋅ 阅读:(260) ⋅ 点赞:(0)

回顾c语言我们是如何实现大小写字母转换的

#define _CRT_SECURE_NO_WARNINGS 
//大小写字母(alphabet)的转换 大->小
#include<stdio.h>
int main()
{
	int ch = 0;//初始化ch,因为getchar的返回值是int,所以初始化的类型也是int
	while ((ch = getchar())!=EOF)//循环输入一个字符ch,这个字符不能读取失败,否则就返回EOF
	{
		printf("%c\n", ch+32);//输出一个字符
		getchar();//读走‘/n';
	}
	return 0;
}

在这里插入图片描述
这里很快我就写出了一种简单的方法,利用ascll码值大小写字母的相差值32的规律。如果是实现小写字母转换成大写字母呢?我们试想一下大写字母+32的ascll码值就转换成了我们的小写字母,反过来小写字母-32的ascll码值是不是我们的大小字母,这是一种换位思考,对于初学者来说还是蛮重要的,验证一下吧:
在这里插入图片描述
思考:但是这样我们一次只能输入一个字符,如果是一串字符呢?如果我想输入一串大写字母再输入一串小写字母呢?

实现大小写母的转换

方法一:
回到我们思考的问题,一次可能输入的不是一个字符,而是一串字符,我们可以用数组来实现,想要输出大写字母和小写字母,这里我们就可以写一个for循环来判断是转换成大写还是小写问题就迎刃而解了!c语言可以用同样的方法,这里我用的C++的语法:

#include <iostream>
using namespace std;
int main()
{
	char a[100];//定义存放100个字符的字符串数组
	int i = 0;
	cout << "请输入一串字符:\n";
	cin >> a;//输入一串字符(一个字符也行)
	for (; a[i]; i++)
	{
		if (a[i] >= 'a' && a[i] <= 'z')
			a[i] -= 32;
		else if (a[i] >= 'A' && a[i] <= 'Z')
			a[i] += 32;
	}
	for (i = 0; a[i]; i++)
		cout << a[i];//输出打印转换后的字符串
	cout << endl;//换行
	system("pause");
	//system ("pause")意思就是让程序暂停一下,然后按任意键继续,初学的时候最多见于程序的末尾处,用于看运行结果,避免程序一闪而过。
	return 0;
}

在这里插入图片描述
划红线处是因为我加了system(“pause”);,方便我们观察,对于初学者这样写有好处!

用函数实现

更简单的方法就是用函数来实现,用我们的toupper和tolower两个函数:
tolower() 如果参数是大写字符,则返回其小写,否则返回该参数.
toupper() 如果参数是小写字母,则返回其大写,否则返回该参数.
方法一:直接上手用


#include <iostream>
using namespace std;
int main()
{
    cout << (char)toupper('a') << endl;//输出大写字母A
    cout << (int)('A')<< endl;//把字符转换成ascll码的值65

    cout << (char)tolower('B') << endl;//输出小写字母b
    cout << (int)tolower('B') << endl;//输出转换成小写字母的ascll码值98

    return 0;
}

在这里插入图片描述

为了让大家看的更清楚,我把转换后的askll码值也打印出来了。
方法二:用迭代器来实现

#include<iostream>
#include<cctype>
#include<vector>
//vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。vector 是C++ STL的一个重要成员,使用它时需要包含头文件:
#include<vector>;
using namespace std;
int main()
{
    vector<char> vch;//定义存放字符型序列的向量容器对象vch
    //string类型会默认结尾是一个空字符,如果一个string只含有一个空字符,则该string为空。vector<char>则不同,含有一个空字符后,就不在是空的。
    int n;
    char elem;//定义字符型元素
    cout << "请输入大小写字符的个数:";
    cin >> n;
    cout << "请输入" << n << "个大小写字符:";
    for (int i = 0; i < n; ++i)
    {
        cin >> elem;
        vch.push_back(elem);// push_back(elem)在数组最后添加字符数据elem
    }

    vector<char>::iterator it = vch.begin();//定义了一个名为it的变量,它的数据类型是由vector<char>定义的iterator类型
    for (it; it != vch.end(); ++it)
    {
        //小写字母转换成大写字母
        if (*it >= 'a' && (*it) <= 'z')//这里如果直接取迭代器it会报错 所以取内容然后取地址不会报错
            *it = toupper(*it);
        else if (*it >= 'A' && (*it) <= 'Z')//大写字母转换成小写字母
            *it = tolower(*it);
    }
    cout << "大小写转化之后的结果:";//输出
    vector<char>::iterator itera = vch.begin();//定义了一个名为itera的变量,它的数据类型是由vector<char>定义的iterator类型,itera变量接受返回的迭代器对象vch并指向字符串的第一个字符
    for (itera; itera != vch.end(); ++itera)//itera不等于指向字符串的末尾(最后一个字符的下一个位置),itera就++
        cout << *itera;//对迭代器加*,即获得该迭代器所指的元素
    cout << endl;
    return 0;
}

在这里插入图片描述
相信C语言代码我们能写出来,C++代码我们一样能写出来!
在这里插入图片描述
注意一些用法:
一.为什么我要定义elem?
elem:elem是单词element(元素)的缩写,在程序定义中代表某一不确定的类型,也就是抽象的数据类型,为了使程序可读性强,并且便于修改,让elem代表多种的数据类型,也就是为int、char等等的数据类型,起了一个别名,在头文件中定义:typedef char elem; //抽象元素类型为char类型,这样定义之后,下面的程序中elem所定义的元素就是char类型的了 ,如果需要修改其类型,直接修改char到其他类型,elem便又代表了所修改的类型数据,这也是方便性的体现。
二.迭代器取地址问题?
1.不能直接取迭代器的地址
2.对迭代器加*,即获得该迭代器所指的元素
3.对迭代器加*,再加&,就是该元素的地址
三.C++中string类下的begin,end,rbegin,rend的用法是什么?
语法:iterator begin();
解释:begin()函数返回一个迭代器,指向字符串的第一个元素.

end
语法:iterator end();
解释:end()函数返回一个迭代器,指向字符串的末尾(最后一个字符的下一个位置).

rbegin
语法:const reverse_iterator rbegin();
解释:rbegin()返回一个逆向迭代器,指向字符串的最后一个字符。

rend
语法:const reverse_iterator rend();
解释:rend()函数返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。

本文含有隐藏内容,请 开通VIP 后查看