不匹配'运营商=='在功能上

时间:2015-03-29 21:10:59

标签: c++ arrays string operator-keyword caesar-cipher

我正在研究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;
}

有人可以帮忙吗?

4 个答案:

答案 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');
相关问题