我试图将字符串中出现的每个字母“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;
}
这是我的五美分
#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];
}
}
}
由于reverseed
是Alphabet
的反向,所以每当遇到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;
}
}
}
注意,有一个更有效的解决方案,因为字符a
tilz
具有连续的值,您可以直接查找它们,而不是使用循环。
而且,您确实应该使用调试器来查看代码的功能。像这样简单的代码是学习如何使用调试器的好机会。