0

我正在研究一个凯撒解密项目,并且在 CaesarDecipher 函数中,我在编译时不断收到此错误:

错误:在 'textInit.std::basic_string<_CharT, _Traits, >_Alloc>::operator[] [with _CharT = char, _Traits = std::char_traits, _Alloc >= std:: 中不匹配 'operator=='分配器](((long unsigned int)i)) == 字母表[j]'</p>

这是该函数的代码:

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

4 回答 4

3

你可能打算声明alphabet

string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

摆脱此错误消息。

正如评论中提到的,您声明了一个由 26 个完整string的 s 组成的数组,但索引 fromtextInit[i]实际上会返回一个char类型(不能std::string依次与合理的类型进行比较)。

于 2015-03-29T21:22:24.757 回答
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这样的字符串索引会返回一个char&(字符引用)。对像字母表这样的字符串数组进行索引会返回一个字符串

因此,当您将 textInit[i] 与 alphabet[j]) 进行比较时,您是在尝试将字符串与 char& 进行比较。没有定义的方法来比较两者,因此程序无法编译。

正如其他人所提到的,一种快速解决方法是将字母声明更改为:

// 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])

现在可以了,因为您正在将 char 与 char& 进行比较,并且类型是兼容的。

于 2015-03-29T21:52:50.840 回答
0

错误的原因是 textInit[i] 和 alphabet[j] 类型不匹配。您可以将字符串字母[26] 更改为字符字母[26]。

于 2015-03-29T21:36:47.680 回答
0

这些其他答案确实解决了您的问题,但有一个不同的解决方案:您可以通过使用 char 类型的性质在恒定时间内执行此检查,而不是遍历字母表。字符只是整数,并且(给定大小写的)字母保证连续排列。所以你可以用这个替换第一个循环:

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

第二个循环也是不必要的。它可以是这样的:

textFinal += (charValue + 'A');
于 2015-03-29T21:57:32.257 回答