2012-01-30 32 views
-2

特定のキーを使用してテキストを復号化するプログラムに取り組んでいます。 replace()を使用しようとしていますが、動作していないようです。たとえば、qwerthelloに復号化されますが、出力はhllloです。この場合、qwertwは復号化されてeになりますが、次にlに再暗号化されます。特定の文字を行に置き換える、C++

入力:

私はこの問題を解決するにはどうすればよい
xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj 
should come out as: 
the quick brown fox jumps over the lazy dog 
I'm getting: 
oga yaacd brozn aox gamav ovar oga lazy dog 

int main() 
{ 
    // ... 
    myFile.open("decrypt.txt"); 
    while (myFile.good()) 
    { 
     getline(myFile, line2); 
     // now line2 is, e.g., "xnm ceuob lrtzv ita hegfd tsmr xnm ypwq ktj" 

     // help here 
     for (int i = 0; i < 26; i++) 
     { 
      replace(line2.begin(), line2.end(), key[i], fox[i]); 
     } 
     v.push_back(line2); 
    } 

    myFile.close(); 

    for (int i = 0; i < numline; i++) 
    { 
     cout << "line " << i <<" = " << v[i] << endl; 
    } 

    return 0; 
} 
+0

ok私はすべての不要なコードを削除し、少し良く説明しました。 – acrogenesis

答えて

1

各文字を一度復号化する必要があります。 2つの配列keyfoxの代わりに(明らかに)代用する文字が含まれている代わりに、入力文字とその復号化されたバージョンの間にmapを作成することを検討することもできます。次に、入力文字列を歩いて、一度に1文字ずつ解読できます。

std::map<char, char> lookup; 
// populate lookup such that lookup['q'] = 'h', lookup['w'] = 'e', etc. 

// walk over line2, decrypting a character at a time. 
for (int i = 0; i < line2.length(); i++) 
{ 
    char c = line2[i]; 
    char d = lookup[c]; 
    line2[i] = d; 
    // or, if you want to keep it on one line: 
    // line2[i] = lookup[line2[i]]; 
} 
+0

この作品はすばらしく編集してくれてありがとう – acrogenesis

2

26個の別々の置換を行うことによって、後のものは以前のものの結果に踏み込んでいます。各置換を1文字につき1回だけ行う方法を見つける必要があります。

+1

文字ごとに一度それを行うためのヒントは、_two_文字列、送信元と送信先を持ち、一方から他方に変換しています。 –

+0

私はreplace_copyを使用しようとしていますが、私はそれが空の場合、行3にコピーしていないように空です。 'for(int i = 0; i <26; i ++){ replace_copy(line2.begin() 、line2.end()、line3.begin()、key [i]、fox [i]); } v.push_back(line3); ' – acrogenesis

-1

C++では、角括弧で文字列要素にアクセスして修正することができます。たとえば:

String str("dog"); 
str[1] = 'c'; 
//str = "dcg" 

だから、replace()の代わりにこの表記を使用することができます。あなたがそれを意図しているときに置き換えがうまくいかなければ、あなたの鍵は間違っているかもしれません。

+0

これは当てはまりますが、ここで問題にはなりません。 replaceは効果的に複数の代入をラッピングするだけです。 – poolie

関連する問題