首页 > 解决方案 > 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” ,但是我现在如何将其应用于字符串中的其余单词?

标签: c++

解决方案


您可以通过多种方式处理数据和转换。存储易于操作的字符串集合的最简单方法之一是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 charbetween(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)

向量中的每个字符串首先转换为小写,然后转换为大写并输出,如上所示。有很多很多方法可以将这些部分组合在一起。熟悉可用于使用标准模板库提供的细节对容器中的每个成员(元素)应用更改的不同工具,可以使您的工作更短且通常更健壮。如果您还有其他问题,请告诉我。


推荐阅读