提问者:小点点

我正在尝试改变一个字符串中英文字母的顺序,对于a,它应该是z,对于b,它应该是y,依此类推。反之亦然


我试图将字符串中出现的每个字母“a”替换为字母“z”,将出现的每个字母“b”替换为“y”,等等,将出现的每个字母“z”替换为“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;
}

共3个答案

匿名用户

这是我的五美分

#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

匿名用户

如果您使用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;
}

匿名用户

你的逻辑有缺陷:

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

由于reverseedAlphabet的反向,所以每当遇到S[i]==Alphabet[z]时,您将替换该字母,但之后您将在Alphabet中再次遇到被替换的字母。

示例:您将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;
                    }
                }
            }

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

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

相关问题