Заменить символы между двумя разными массивами C ++ - PullRequest
2 голосов
/ 12 декабря 2011

У меня есть два массива алфавита, которые были отсортированы двумя разными способами и в нужном мне порядке.теперь мне нужно заменить по порядку первую букву в 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 ]

3 голосов
/ 12 декабря 2011

Другие ответы, хотя и возможны, кажутся медленными и неэффективными.

Лучший способ, о котором я могу думать, это:

  1. Зацикливание каждого символа в «зашифрованном»текстовый файл
  2. Узнайте, в каком элементе находится текущий символ в вашем массиве частот.У вас уже есть функция find_in_array(), чтобы помочь вам сделать это.
  3. Напишите символ, который лежит в индексе вашего «зашифрованного» массива рангов

Вы, очевидно, захотите броситьв некоторой базовой проверке ошибок, чтобы убедиться, что не алфавитные символы не ищутся в ваших двух индексных массивах.

Некоторым примером 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;
    }
}

Надеюсь, что это поможет.

2 голосов
/ 12 декабря 2011

Если вы не хотите использовать 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
1 голос
/ 12 декабря 2011

Может быть, лучше пройти строку, которую вы хотите расшифровать по одному символу за раз, и изменить символы. так:

for (int i = 0; i < fileChars.size(); i++)
{
    for(int j = 0; j < 26; j++){
        if(fileChars[i]==indexb[j]){
            fileChars[i]=indexa[j];
        }
    }
}

Это не так эффективно с вложенным циклом, но будет работать.

...