2012-01-30 85 views
-2

我正在使用特定的密鑰解密文本的程序。我試圖使用replace(),但它似乎沒有工作。例如,qwert應解密爲hello,但輸出爲hlllo;在這種情況下中的w被解密爲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

好吧,我刪除了所有不必要的代碼,並解釋了一點點。 – acrogenesis 2012-01-30 23:21:19

回答

1

您需要解密每個字符一次。代替有兩個數組,keyfox(顯然)包含要替換的字符,您可以考慮在輸入字符及其解密版本之間構建一個map。然後你可以簡單地遍歷輸入字符串,一次解密一個字符。

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 2012-02-01 00:19:06

2

通過作出26個單獨的替換,後面的那些正在踩上前面的結果。你需要找到一種方法來讓每個角色只發生一次替換。

+1

爲每個角色做一次提示是_two_字符串,一個來源和一個目的地,並從一個轉換到另一個。 – 2012-01-30 23:40:08

+0

我想使用replace_copy但是當我cout v它是空的,就好像它不復制到line3 'for(int i = 0; i <26; i ++){ replace_copy(line2.begin() ,line2.end(),line3.begin(),key [i],fox [i]); } v.push_back(line3);' – acrogenesis 2012-01-31 00:33:40

-1

在C++中,您可以使用方括號來訪問和修改字符串元素。例如:

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

所以,你可以使用這個符號來代替replace()。如果替換不起作用,那麼你的密鑰可能是錯誤的。

+0

這是真的,但這不是問題。替換實際上只是包裝了多個作業。 – poolie 2012-01-31 22:26:54