目录
2.cctype头文件中对字符的一些操作(一部分)和几个例题
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++进行进一步的学习。如果有蓝桥杯等比赛的朋友们可以着重关注一下。