c++ - c++ - 如何将字符串中的所有大写字母转换为小写字母,反之亦然?
问题描述
我收到的挑战是:
练习 2 – 字符串
常量 int TOWNTOTAL = 6; 字符串城镇[TOWNTOTAL] = {“伦敦”,“glasGow”,“HARWICH”,“NoTtInGHaM”,“DERBy”,“BriSTOL”};
字符串中的字母存储为 ASCII 数字。
字母“a”存储为数字 97。字母“A”存储为数字 65。
添加 32 会将大写字母变为小写字母。
减去 32 会将小写字母变为大写字母。
使用上面的字符串,更改列表,使所有城镇都以大写字母开头,但其余字母为小写。
到目前为止我的代码是
int main()
{
const int TOWNTOTAL = 6;
string towns[TOWNTOTAL] = { "london", "glasGow", "HARWICH", "NoTtInGHaM","DERBy","BriSToL" };
for (int j = 0; j < towns[TOWNTOTAL].length(); j++) {
towns[j][0] = int(towns[j][0] - 32);
towns[j][0] = char(towns[j][0]);
cout << towns[j] << " ";
for (int i = 0; i < towns[j].length(); i++) {
}
}
}
所以我已经能够遍历城镇字符串中的每个单词并输出第一个字母,我什至能够将字母“g”转换为 ASCII,减去 32 并将其转换回字符以获得“G” ,但是我现在如何将其应用于字符串中的其余单词?
解决方案
您可以通过多种方式处理数据和转换。存储易于操作的字符串集合的最简单方法之一是std::vector,然后允许您创建一个std::vector<std::string>
(字符串向量)。一个简单的基于范围的for
循环提供了遍历每个字符串所需的一切。
要将每个字符串中的字符转换为大写/小写,std::transform提供了一种简单的方法来转换每个字符串中的所有或部分字符(或对容器中的每个元素应用任何其他操作)您的转换为小写和大写,然后减少为:
void stolower (std::string& s)
{
std::transform (s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::tolower(c); });
}
和
void stoupper (std::string& s)
{
std::transform (s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::toupper(c); });
}
(注意:上面的使用std::transform
省略了尾随返回类型。添加-> unsigned char
between(unsigned char c) { return std::toupper(c); });
将提供完整的形式)
在上述每种情况下,转换都应用于从 开始的字符范围s.begin(), s.end()
,输出从 开始的转换s.begin()
,其中转换本身由 lambda 函数[](unsigned char c) { return std::tolower(c); }
或toupper(c)
对应函数提供。
要实现您的字符串向量,然后执行转换到较低然后到较高的转换,您可以执行以下操作:
int main (void) {
std::vector<std::string> towns = { "london", "glasGow", "HARWICH",
"NoTtInGHaM","DERBy","BriSToL" };
for (auto& s : towns) {
stolower(s);
std::cout << std::left << std::setw(12) << s << " (";
stoupper(s);
std::cout << s << ")\n";
}
}
(注意:<< std::left << std::setw(12)
标题提供的只是<iomanip>
允许输出采用整齐的表格形式)
把它放在一起并添加所需的标题,你可以这样做:
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <cctype>
#include <algorithm>
void stolower (std::string& s)
{
std::transform (s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::tolower(c); });
}
void stoupper (std::string& s)
{
std::transform (s.begin(), s.end(), s.begin(),
[](unsigned char c) { return std::toupper(c); });
}
int main (void) {
std::vector<std::string> towns = { "london", "glasGow", "HARWICH",
"NoTtInGHaM","DERBy","BriSToL" };
for (auto& s : towns) {
stolower(s);
std::cout << std::left << std::setw(12) << s << " (";
stoupper(s);
std::cout << s << ")\n";
}
}
示例使用/输出
$ ./bin/strcasetransform
london (LONDON)
glasgow (GLASGOW)
harwich (HARWICH)
nottingham (NOTTINGHAM)
derby (DERBY)
bristol (BRISTOL)
向量中的每个字符串首先转换为小写,然后转换为大写并输出,如上所示。有很多很多方法可以将这些部分组合在一起。熟悉可用于使用标准模板库提供的细节对容器中的每个成员(元素)应用更改的不同工具,可以使您的工作更短且通常更健壮。如果您还有其他问题,请告诉我。
推荐阅读
- asp.net-mvc - 将字符串传递给 DocumentHelper.GetDocuments().Where() 时出现异常
- xcode - Xcode Generate Code Coverage Report failed with Error : Error Domain=IDEFoundationErrorDomain Code=14 "Failed to merge raw profile in directory
- swift - Swift NSCollectionView 从下到上流程
- bash - 如何仅grep一行中的第一个字符串
- amazon-web-services - AWS 中的重复 Docker 映像
- javascript - JIRA API 在单个 api 调用中创建问题和子任务
- git - 是否可以在接收后挂钩中区分 oldrev 和 newrev 中的文件?
- r - 在 R 中折叠重复项,其中只有唯一的列值被连接
- docker - Golang docker多阶段构建无法运行:exec:“go”:$PATH中找不到可执行文件
- javascript - 使用两个功能打印和计算总数