我正在尝试编写一个小函数,将小写字符翻转到字母表后半部分的对称对应字符 - 26个字母= 13/13。
a = z,b = y,c = x ...
我尝试了以下代码但由于某种原因它只适用于第一个字符。
说我输入“bamba”;它首先将'b'切换为'y'然后它被卡住并将所有其他字符替换为'y',然后我得到“yyyyy”。
我尝试了一下代码,并发现如果我删除当前字符的依赖性,我可以安全地增加所有字母,比如1(a = b,b = c ...)
symmetric_difference = 1; **commented out** //21 - toCrypt[i];
我全神贯注地找到了最接近的东西 “扭转字符串中单个字符的字母值”,但它描述了一种看似奇怪和冗余的方式。
有谁能告诉我我做错了什么(假设我做错了?)
#include <iostream>
using namespace std;
void crypto(char[]);
int main()
{
char toCrypt[80];
cout << "enter a string:\n";
cin >> toCrypt;
crypto(toCrypt);
cout << "after crypto:\n";
cout << toCrypt;
}
void crypto(char toCrypt[]) // "Folding" encryption.
{
int size = strlen(toCrypt);
int symmetric_difference;
for (int i = 0; i < size; i++)
{
symmetric_difference = 121 - toCrypt[i]; // Calculate the difference the letter has from it's symmetric counterpart.
if (toCrypt[i] >= 97 && toCrypt[i] <= 110) // If the letter is in the lower half on the alphabet,
toCrypt[i] += symmetric_difference; // Increase it by the difference.
else
if (toCrypt[i] >= 111 && toCrypt[i] <= 122) // If it's in the upper half,
toCrypt[i] -= symmetric_difference; // decrease it by the difference.
}
}
答案 0 :(得分:3)
你可以试试这个
for (int i = 0; i < size; i++)
{
toCrypt[i] = 'z' - toCrypt[i] + 'a';
}
答案 1 :(得分:1)
在您的示例bamba
中,所有字符都会进入第一个if语句:toCrypt[i] += symmetric_difference;
。
toCrypt[i] += symmetric_difference;
-> toCrypt[i] = toCrypt[i] + 121 - toCrypt[i];
-> toCrypt[i] = 121 = 'y'
答案 2 :(得分:0)
如果我没有输入拼写错误,请尝试以下函数定义。
void crypto( char s[] )
{
static const char alpha[] = "abcdefghijklmnopqrstuvwxyz";
const char *last = alpha + sizeof( alpha ) - 1;
while ( char &c = *s++ )
{
if ( const char *first = std::strchr( alpha, c ) ) c = *( last - ( first - alpha ) - 1 );
}
}
考虑到无需按顺序排列小写字母。例如,如果我没有弄错,它对EBCDIC无效。
我想替换声明
const char *last = alpha + sizeof( alpha ) - 1;
代表
const char *last = alpha + sizeof( alpha ) - sizeof( '\0' );
但是最后一个与C不兼容:。)