Заменить конкретные символы в строке, C ++ - PullRequest
0 голосов
/ 31 января 2012

Я работаю над программой для расшифровки текста с помощью определенного ключа. Я пытаюсь использовать replace(), но, похоже, это не работает. Например, qwert должен расшифровываться до hello, но вывод будет hlllo; в этом случае w в qwert расшифровывается до e, но затем повторно расшифровывается до l.

ввод:

 xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj
 should come out as:
 the quick brown fox jumps over the lazy dog
 I'm getting:
 oga yaacd brozn aox gamav ovar oga lazy dog

Как я могу это исправить?

int main()
{
    // ...
    myFile.open("decrypt.txt");
    while (myFile.good()) 
    {
        getline(myFile, line2);
        // now line2 is, e.g., "xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj"

        // help here
        for (int i = 0; i < 26; i++) 
        {
            replace(line2.begin(), line2.end(), key[i], fox[i]);
        }
        v.push_back(line2);
    }

    myFile.close();

    for (int i = 0; i < numline; i++) 
    {
        cout << "line " << i <<" = " << v[i] << endl;
    }

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 31 января 2012

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

1 голос
/ 31 января 2012

Вам необходимо расшифровать каждый символ один раз.Вместо двух массивов key и fox, которые (по-видимому) содержат заменяемые символы, вы можете рассмотреть создание карты между входными символами и их расшифрованными версиями.Затем вы можете просто пройтись по входной строке, расшифровывая символ за раз.

std::map<char, char> lookup; 
// populate lookup such that lookup['q'] = 'h', lookup['w'] = 'e', etc.

// walk over line2, decrypting a character at a time.
for (int i = 0; i < line2.length(); i++)
{
    char c = line2[i];
    char d = lookup[c];
    line2[i] = d;
    // or, if you want to keep it on one line:
    // line2[i] = lookup[line2[i]];
}
0 голосов
/ 31 января 2012

В C ++ вы можете получить доступ и изменить строковые элементы в квадратных скобках. Например:

String str("dog");
str[1] = 'c';
//str = "dcg"

Таким образом, вы можете использовать эту запись вместо replace(). Если замена не работает так, как вы собираетесь, возможно, ваш ключ неверный.

...