Каким образом заменить функцию .find() языка python в языке c++
Всем привет! Появилась задача переписать небольшой код с языка python на c++ (суть задачи: шифрование сообщения многоалфавитной одноконтурной подстановкой) и возникла проблема замены функции .find() в Пайтон на что либо другое в плюсах. Пытался и через цикл и через функцию find в с++ - не выходит. Если сможете помочь - буду очень благодарен!
Код на Python:
alphabet_two = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?."
alphabet_three = "АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ."
alphabet_four = "STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?"
def crypt (message, alphabet_one, alphabet_two, alphabet_three, alphabet_four):
result = ''
for i in range(0, len(message), 3):
index = alphabet_one.find(message[i])
result += alphabet_two[index]
if i + 1 < len(message):
index = alphabet_one.find(message[i + 1])
result += alphabet_three[index]
if i + 2 < len(message):
index = alphabet_one.find(message[i + 2])
result += alphabet_four[index]
return result
def decrypt(message, alphabet_one, alphabet_two, alphabet_three, alphabet_four):
result = ''
for i in range (0, len(message), 3):
index = alphabet_two.find(message[i])
result += alphabet_one[index]
if i + 1<len(message):
index = alphabet_three.find(message[i+1])
result += alphabet_one[index]
if i + 2 < len(message):
index = alphabet_four.find(message[i+2])
result += alphabet_one[index]
return result
Мои попытки на плюсах:
#include <iostream>
#include <string>
using namespace std;
string alphabet_one = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,абвгдеёжзийклмнопрстуфхцчшщъыь!?эюя;.-";
string alphabet_two = "ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?.";
string alphabet_three = "АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ.";
string alphabet_four = "STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?";
string crypt (string message, string alphabet_one, string alphabet_two, string alphabet_three, string alphabet_four)
{
string result = "";
for (int i = 0; i < message.length() - 1; i += 3)
{
int index = 0;
for (int y = 0; y < alphabet_one.length(); y++)
{
if (alphabet_one[y] != message[y])
{
index++;
}
else
{
break;
}
}
result += alphabet_two[index];
if (i + 1 < message.length())
{
for (int t = 0; t < alphabet_one.length(); t++)
{
if (alphabet_one[t] != message[t + 1])
{
index++;
}
else
{
break;
}
}
result += alphabet_three[index];
}
if (i + 2 < message.length())
{
for (int r = 0; r < alphabet_one.length(); r++)
{
if (alphabet_one[r] != message[r + 2])
{
index++;
}
else
{
break;
}
}
result += alphabet_four[index];
}
}
return result;
}
int main()
{
string message;
cin >> message;
cout << crypt(message,alphabet_one,alphabet_two,alphabet_three,alphabet_four) << endl;
}
Ответы (2 шт):
У класса std::string есть точно такой же метод find() (с некоторыми исключениями). Если передать туда символ, то он вернёт индекс первого вхождения в строке этого символа, либо -1, если такого символа нет. Подробнее можете прочитать здесь
У вас проблема в том, что вы используете std::string для русских букв. Надо использовать std::wstring, иначе поиск работать с русскими буквами не будет.
Перепишите код в лоб с использованием wstring. Ну и в функцию передавайте константные ссылки, чтобы не было копирования больших строк.
Вот так работает:
wstring alphabet_one = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ ,абвгдеёжзийклмнопрстуфхцчшщъыь!?эюя;.-";
wstring alphabet_two = L"ABCDEFGHIJKLMNOPQRSTUVWXYZ[]{}$#@+=_*&^%,-abcdefghijklmnopqr|/tuvwxyz:!?.";
wstring alphabet_three = L"АБВГДЕЁЖЗИЙКЛМНОПРСТУ ,абвгдеёжзий-клмнопрстуфхцчшщъыьэюя;ФХЦЧШЩ|/ЪЫЬЭЮЯ.";
wstring alphabet_four = L"STUVWXYZ[]{}$#@+=_*&^%,abcdABCDEFGHIJKLMNOPQRefghijk-lmnopqrst|/uvwxyz:!?";
wstring crypt ( const wstring& message,
const wstring& alphabet_one,
const wstring& alphabet_two,
const wstring& alphabet_three,
const wstring& alphabet_four)
{
wstring result;
for (int i = 0; i < message.length(); i += 3)
{
int index = alphabet_one.find(message[i]);
result += alphabet_two[index];
// ну и так далее
}
int main()
{
ios_base::sync_with_stdio(false);
wcin.imbue(locale("en_US.UTF-8"));
wcout.imbue(locale("en_US.UTF-8"));
wstring message = L"привет";
//wcin >> message;
wcout << crypt( message, alphabet_one, alphabet_two, alphabet_three, alphabet_four) << endl;
}
И не забывайте, что входная строка должна обязательно состоять из символов, имеющихся в wstring alphabet_one. Иначе функция wstring::find() вернет npos, т.е. -1, и вы получите ошибку по обращению к массиву (строке) с отрицательным индексом. В коде питона эта неопределенность тоже присутствует.