我有两个字母数组,它们按照我需要的顺序以两种不同的方式排序。现在我需要按顺序将indexb []中的第一个字母替换为indexa []中的第一个字母,一直到它们的第26个字母。我已经使用了replace()函数然后更改了我需要交换字母的文本中的字母,然后输出所有交换的消息。但代码并没有交换我想要交换的正确字母。有什么建议吗?
char c;
vector<char> fileChars;
while (code.good())
{
code.get(c);
fileChars.push_back(c);
}
for (int i = 0; i < 26; i++)
{
replace(fileChars.begin(), fileChars.end(),indexb[i],indexa[i]);
}
for (int i = 0; i < fileChars.size(); i++)
{
decrypted<< fileChars[i];
}
答案 0 :(得分:3)
其他答案虽然可能显得缓慢且效率低下。
我能想到的最好方法是:
find_in_array()
功能来帮助您完成此任务。您显然希望引入一些基本的错误检查,以确保在您的两个索引数组中不会查找非字母字符。
使用C ++的一些示例将是:
char c;
int pos;
while (code.good())
{
code.get(c);
if ( (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') )
{
pos = find_in_array(indexb, c, 26);
decrypted << indexa[pos];
}
else
{
decrypted << c;
}
}
希望有所帮助。
答案 1 :(得分:2)
除非你想为你的角色使用wchar_t
,否则你会过度复杂。您可以使用一个或两个数组(仅当您想要快速编码和解码时才能使用两个数组;也可以使用一个数组执行所有操作(类似于您尝试的操作),但这样做更慢,更多明智的表现。)
这个想法是,做类似以下的事情。您应该能够在不对现有代码进行任何重大更改的情况下执行此操作(只需更改阵列的设置和使用方式)。
char encoder[256];
char decoder[256];
现在以你做的任何方式生成你的字典,对于每个字符,你应该得到你将存储在这些数组中的以下两个变量:
char from = 'a'; // the unencoded character
char to = 'x'; // the encoded character
// store them in the arrays for later use:
encoder[from] = to;
decoder[to] = from;
就是这样!要对字符串进行编码,请执行以下操作:
// these two could be pointers to buffers too
char my_string[] = "Hello World!";
char my_string_enc[256];
unsigned int p = 0;
while(my_string[p])
my_string_enc[p] = encoder[my_string[p++]];
my_string_enc[p] = '\0'; // null terminating the encoded string
解码可以用类似的方式完成:
// these two could be pointers to buffers too
char my_string_enc[] = "...";
char my_string[256];
unsigned int p = 0;
while(my_string_enc[p])
my_string[p] = decoder[my_string_enc[p++]];
my_string[p] = '\0'; // null terminating again
答案 2 :(得分:1)
最好一次查看要解密一个字符的字符串并更改字符。 这样:
for (int i = 0; i < fileChars.size(); i++)
{
for(int j = 0; j < 26; j++){
if(fileChars[i]==indexb[j]){
fileChars[i]=indexa[j];
}
}
}
使用嵌套循环效率不高,但它可以正常工作。