我正在尝试更改字符串中英文字母的顺序,例如对于 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];
}
}
}
因为reversed
是alphabet
的逆序,遇到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;
}
}
}
请注意,有一个更有效的解决方案,因为字符 a
到 z
具有连续值,您可以直接查找它们而不是使用循环。
此外,您确实应该使用调试器来查看代码的作用。像这样简单的代码是学习如何使用调试器的好机会。
如果您使用的是 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
我试图用字母 '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];
}
}
}
因为reversed
是alphabet
的逆序,遇到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;
}
}
}
请注意,有一个更有效的解决方案,因为字符 a
到 z
具有连续值,您可以直接查找它们而不是使用循环。
此外,您确实应该使用调试器来查看代码的作用。像这样简单的代码是学习如何使用调试器的好机会。
如果您使用的是 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