我正在尝试更改字符串中英文字母的顺序,例如对于 a 应为 z,对于 b 应为 y,等等。反之亦然

I am trying to change the order of english alphabets in a string such that for a it shall be z, for b it shall be y, etc.. and vice versa

我试图用字母 'z' 替换字母 'a' 的每一次出现,将 'b' 的每一次出现替换为 'y',等等,以及每一次出现的'z' by 'a'.. 在一个字符串中。但是代码没有给出所需的输出...

int main()
{

    string S;
    cin >> S;
    string alphabet = "abcdefghijklmnopqrstuvwxyz";
    string reversed = "zyxwvutsrqponmlkjihgfedcba";
    int N = S.length();

        for(int i = 0; i < N; i++)
        {
            for(int z = 0; z < 26; z++)
            {
                if(S[i] == alphabet[z])
                {
                    S[i] = reversed[z];
                }
            }
        }
        cout << S << endl;
}

你的逻辑有问题:

 for(int i = 0; i < N; i++)
        {
            for(int z = 0; z < 26; z++)
            {
                if(S[i] == alphabet[z])
                {
                    S[i] = reversed[z];
                }
            }
        }

因为reversedalphabet的逆序,遇到S[i]== alphabet[z]就替换字母,之后又会在[=13=遇到被替换的字母].

示例:您将 a 替换为 z,但在循环结束时您找到 z 并将其替换为 a

为避免替换被替换的字符,请在替换后跳出循环:

 for(int i = 0; i < N; i++)
            {
                for(int z = 0; z < 26; z++)
                {
                    if(S[i] == alphabet[z])
                    {
                        S[i] = reversed[z];
                        break;
                    }
                }
            }

请注意,有一个更有效的解决方案,因为字符 az 具有连续值,您可以直接查找它们而不是使用循环。

此外,您确实应该使用调试器来查看代码的作用。像这样简单的代码是学习如何使用调试器的好机会。

如果您使用的是 ASCII,您可以这样做:

int main()
{
    std::string S;
    std::cin >> S;
    std::for_each(std::execution::par_unseq, S.begin(), S.end(), 
                  [](char &c) { c = 'a' + 'z' - c; });
    std::cout << S << std::endl;
}

这是我的五分钱。:)

#include <iostream>
#include <string>
#include <cctype>
#include <cstring>

int main()
{
    const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    const size_t N = sizeof( alphabet ) - 1;

    std::string s( alphabet );

//  std::cin >> s;

    for (auto &c : s)
    {
        if (const char *p = std::strchr( alphabet, std::tolower( ( unsigned char )c ) ) )
        {
            size_t i = p - alphabet;

            if (std::isupper( c ))
            {
                c = std::toupper( alphabet[N - i - 1] );
            }
            else
            {
                c = alphabet[N - i - 1];
            }
        }
    }

    std::cout << alphabet << '\n';
    std::cout << s << '\n';
}

程序输出为

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba

请注意,用户可以输入字母表中不存在的符号或大写字母。程序应该正确处理这种情况。

例如,如果用户将输入字符串 "AbcxyZ",那么程序输出将为

ZyxcbA

您可以编写一个单独的函数来完成该任务。例如。

#include <iostream>
#include <string>
#include <cctype>
#include <cstring>

std::string & reverse_letters( std::string &s )
{
    const char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
    const size_t N = sizeof( alphabet ) - 1;

    for (auto &c : s)
    {
        if (const char *p = std::strchr( alphabet, std::tolower( ( unsigned char )c ) ))
        {
            size_t i = p - alphabet;

            if (std::isupper( c ))
            {
                c = std::toupper( alphabet[N - i - 1] );
            }
            else
            {
                c = alphabet[N - i - 1];
            }
        }
    }

    return s;
}

int main()
{
    std::string s( "AbcxyZ" );

    std::cout << s << '\n';
    std::cout << reverse_letters( s ) << '\n';

    s.assign( "A1b2y3Z4" );

    std::cout << s << '\n';
    std::cout << reverse_letters( s ) << '\n';
}

程序输出为

AbcxyZ
ZyxcbA
A1b2y3Z4
Z1y2b3A4