我正在研究caesar decipher项目,在CaesarDecipher函数中,我在编译时不断收到此错误:
错误:'textInit.std :: basic_string< _CharT,_Traits,> _Alloc> :: operator [] [与_CharT = char,_Traits = std :: char_traits,_Alloc&gt]中的'operator =='不匹配; = std :: allocator](((long unsigned int)i))== alphabet [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 :(得分:3)
你可能想要声明alphabet
喜欢
string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
删除此错误消息。
正如评论中所提到的那样,您声明了一个包含26个完整版string
的数组,但从textInit[i]
开始编制索引实际上会返回char
类型(无法与std::string
进行比较{1}}合理地反过来)。
答案 1 :(得分:1)
错误意味着您正在尝试比较两种不同的类型,并且这两种类型没有定义的相等运算符。
你提到这条线特别错:
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 之类的字符串会返回字符&amp; (字符引用)。 索引到像字母这样的字符串数组会返回字符串。
因此,当您将textInit [i]与alphabet [j]进行比较时,您正在尝试将字符串与char&amp;进行比较。没有定义的方法来比较这两者,因此程序无法编译。
正如其他人所提到的,一个快速解决方法是将字母表声明更改为:
// 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'};
现在,alphabet是一个字符数组,索引到字母表会返回一个char(一个字符)。这一行:
if (textInit[i] == alphabet[j])
现在可以了,因为您将char与char&amp;进行比较,并且类型是兼容的。
答案 2 :(得分:0)
错误原因是textInit [i]和alphabet [j]类型不匹配。 您可以将字符串字母[26]更改为字母[26]。
答案 3 :(得分:0)
这些其他答案确实可以解决您的问题,但是有一个不同的解决方案:您可以通过使用char类型的性质,在恒定时间内进行迭代,而不是迭代字母表。字符只是整数,并且(给定情况的)字母保证连续排序。所以你可以用这个代替第一个循环:
if (textInit[i] >= 'A' && textInit[i] <= 'Z') {
charValue = textInit[i] - 'A';
}
第二个循环也是不必要的。它可以是这样的:
textFinal += (charValue + 'A');