替换两个不同的数组C ++之间的字符

时间:2011-12-12 17:13:50

标签: c++ arrays vector replace char

我有两个字母数组,它们按照我需要的顺序以两种不同的方式排序。现在我需要按顺序将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];
                }

3 个答案:

答案 0 :(得分:3)

其他答案虽然可能显得缓慢且效率低下。

我能想到的最好方法是:

  1. 循环遍历&#34;加密&#34;中的每个字符。文本文件
  2. 找出当前角色在您的&#34;频率&#34;中的哪个元素。阵列。您已经拥有find_in_array()功能来帮助您完成此任务。
  3. 写下你的&#34;加密&#34;的索引中的字符。排名数组
  4. 您显然希望引入一些基本的错误检查,以确保在您的两个索引数组中不会查找非字母字符。

    使用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];
        }
    }
}

使用嵌套循环效率不高,但它可以正常工作。