0

私はシーザー解読プロジェクトに取り組んでおり、CaesarDecipher 関数では、コンパイル時にこのエラーが発生し続けます。

エラー: 'textInit.std::basic_string<_CharT, _Traits, >_Alloc>::operator[] の 'operator==' に一致しません [with _CharT = char, _Traits = std::char_traits, _Alloc >= std::アロケータ](((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";

このエラー メッセージを取り除くには。

stringコメントで述べたように、代わりに26 個の本格的な s の配列を宣言しましたが、textInit[i]実際には from からのインデックス付けによって型が返されます(これは合理的に順番charに比較することはできません)。std::string

于 2015-03-29T21:22:24.757 に答える
1

このエラーは、2 つの異なる型を比較しようとしており、これら 2 つの型に対して定義された等値演算子がないことを意味します。

特にこの行に問題があると述べました:

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& (文字参照)が返されます。アルファベットのような文字列の配列にインデックスを付けると、 stringが返されます。

したがって、textInit[i] を alphabet[j]) と比較する場合、文字列を char& と比較しようとしています。この 2 つを比較する方法は定義されていないため、プログラムはコンパイルに失敗します。

他の人が言及したように、簡単な修正の 1 つは、アルファベット宣言を次のように変更することです。

// 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 は文字の配列であり、alphabet へのインデックス付けは char (文字) を返します。だから行:

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

char と char& を比較していて、型に互換性があるため、これで問題ありません。

于 2015-03-29T21:52:50.840 に答える
0

これらの他の回答は問題を解決しますが、別の解決策があります。アルファベットを反復処理する代わりに、char 型の性質を使用して一定時間でこのチェックを行うことができます。文字は単なる整数であり、(特定のケースの) 文字は連続した順序であることが保証されています。したがって、最初のループを次のように置き換えることができます。

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

そして、その 2 番目のループも不要です。それはちょうどこれである場合もあります:

textFinal += (charValue + 'A');
于 2015-03-29T21:57:32.257 に答える
0

エラーの原因は、型 textInit[i] と alphabet[j] が一致しないことです。文字列 alphabet[26] を文字 alphabet[26] に変更できます。

于 2015-03-29T21:36:47.680 に答える