Нет соответствия для оператора == в функции

Я работаю над проектом Цезарь расшифровать, и в функции CaesarDecipher я получаю эту ошибку при компиляции:

ошибка: нет соответствия для оператора == в textInit.std :: basic_string<_CharT, _Traits,> _Alloc> :: operator [] [с _CharT = char, _Traits = std :: char_traits, _Alloc> = std :: allocator] (((long unsigned int) i)) == алфавит [j] ’

Вот код для этой функции:

string CipherMessage::CaesarDecipher(string key)
{
int keyValue;
int charValue;
string textInit = m_text;
string textFinal;
// Initializes an array containing the alphabet. A=index 0, B=index 1, etc
string alphabet[26] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","\
O","P","Q","R","S","T","U","V","W","X","Y","Z"};

for (int i=0; i<=25; i++){
if (alphabet[i] == key)
keyValue = i;
}
for (int i=0; i<=textInit.length(); i++){
for (int j=0; j<=25; j++){
if (textInit[i] == alphabet[j])   // Error occurs here
charValue = j;
}
charValue = (charValue+keyValue)%26;
for (int j=0; j<=25; j++){
if (charValue == j)
textFinal += alphabet[j];
}
}
cout << "Final " << textFinal << endl;

return textFinal;
}

Кто-нибудь может помочь?

0

Решение

Вы, вероятно, хотели объявить alphabet лайк

string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

чтобы избавиться от этого сообщения об ошибке.

Как уже упоминалось в комментарии, вы объявили массив из 26 полноценных stringвместо этого, но индексация от textInit[i] на самом деле возвращает вам char тип (который нельзя сравнить с std::string разумно по очереди).

3

Другие решения

Ошибка означает, что вы пытаетесь сравнить два разных типа, и для этих двух типов нет определенного оператора равенства.

Вы упомянули эту строку, в частности виноват:

if (textInit[i] == alphabet[j])

Каков тип textInit и тип алфавита? Посмотрите на ваши заявления:

// textInit is a string
string textInit = m_text;

// alphabet is an array of strings
string alphabet[26] ={"A","B","C","D","E","F","G","H","I","J","K","L","M","N","\
O","P","Q","R","S","T","U","V","W","X","Y","Z"};

Индексирование в строку типа textInit возвращает голец& (ссылка на символ).
Индексирование в массив строк, таких как алфавит возвращает строка.

Таким образом, когда вы сравниваете textInit [i] с alphabet [j]), вы пытаетесь сравнить строку с символом&, Не существует определенного способа сравнить их, поэтому программа не может быть скомпилирована.

Как уже упоминалось, одним из быстрых решений является изменение объявления алфавитов на:

// note that single quotes ('') are used for characters while double quotes "" are used for strings
char alphabet[26] ={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};

Теперь алфавит представляет собой массив символов, а индексирование по алфавиту возвращает символ (символ). Итак, строка:

if (textInit[i] == alphabet[j])

теперь все в порядке, потому что вы сравниваете символ с символом&и типы совместимы.

1

Причиной ошибки является то, что типы textInit [i] и alphabet [j] не совпадают.
Вы можете изменить строковый алфавит [26] на символьный алфавит [26].

0

Эти другие ответы решают вашу проблему, но есть другое решение: вместо итерации по алфавиту вы можете выполнять эту проверку в постоянное время, используя природу типа char. Символы являются просто целыми числами, и буквы (в данном случае) гарантированно будут в последовательном порядке. Таким образом, вы можете заменить первый цикл следующим:

if (textInit[i] >= 'A' && textInit[i] <= 'Z') {
charValue = textInit[i] - 'A';
}

И этот второй цикл тоже не нужен. Это может быть просто так:

textFinal += (charValue + 'A');
0
По вопросам рекламы [email protected]