2011-12-12 57 views
2

我有兩個字母表中的數組,它們按照兩種不同的方式排序,並按我需要的順序排列。現在我需要按順序將indexb []中的第一個字母替換爲indexa []中的第一個字母,直到它們的第26個字母。我已經使用replace()函數,然後更改文本中我需要交換字母的字母,然後用所有交換輸出消息。但代碼不會交換我想交換的正確字母。有什麼建議?替換兩個不同數組之間的字符C++

   char c; 
       vector<char> fileChars; 
       while (code.good())           
       { 
        code.get(c); 
        fileChars.push_back(c); 

       } 
       for (int i = 0; i < 26; i++) 
       { 
        replace(fileChars.begin(), fileChars.end(),indexb[i],indexa[i]); 
       } 

       for (int i = 0; i < fileChars.size(); i++) 
       { 
        decrypted<< fileChars[i]; 
       } 
+0

這是在Java嗎? – chance

+0

對不起,它的C++ – Dom

+0

並沒有真正得到你想要達到的效果。我假設你有一個文本,你想用另一個字符替換每個字符(解密)。是對的嗎? – yoshi

回答

3

其他答案雖然可能看起來很慢並且效率低下。

我能想到的最好的辦法是:

  1. 遍歷中的「加密」的文本文件
  2. 找出每個字符在該元件的電流角色就在於你的「頻率」陣列。你已經有了find_in_array()的功能來幫助你做到這一點。
  3. 編寫在於你的「加密」等級數組的索引字符

你顯然會希望在一些基本的錯誤檢查,以確保非字母字符不會在你的兩個指標尋找扔陣列。

一些例如C++讓你去是:

char c; 
int pos; 
while (code.good()) 
{ 
    code.get(c); 
    if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) 
    { 
     pos = find_in_array(indexb, c, 26); 
     decrypted << indexa[pos]; 
    } 
    else 
    { 
     decrypted << c; 
    } 
} 

希望有所幫助。

+1

只是把這個代碼放在一個工程中!生病檢查錯誤,謝謝! – Dom

2

除非你想使用wchar_t爲你的角色你是過於複雜了。你可以使用一個或兩個數組(只有在想要快速編碼和解碼時才使用兩個數組;也可以使用一個數組完成所有操作(類似於您嘗試執行的操作),但速度更慢且速度更快昂貴的表現明智)。

想法是,做下面的事情。您應該可以在不對現有代碼做任何重大更改的情況下執行此操作(只需更改陣列的設置和使用方式即可)。

char encoder[256]; 
char decoder[256]; 

現在生成您在你做任何方式,它的字典,對於每一個字符,你應該讓你存儲以下兩個變量在這些陣列:

char from = 'a'; // the unencoded character 
char to = 'x'; // the encoded character 

// store them in the arrays for later use: 
encoder[from] = to; 
decoder[to] = from; 

這就是它!要編碼字符串,請執行下列操作:

// these two could be pointers to buffers too 
char my_string[] = "Hello World!"; 
char my_string_enc[256]; 

unsigned int p = 0; 

while(my_string[p]) 
    my_string_enc[p] = encoder[my_string[p++]]; 
my_string_enc[p] = '\0'; // null terminating the encoded string 

解碼可以以類似的方式來完成:

// these two could be pointers to buffers too 
char my_string_enc[] = "..."; 
char my_string[256]; 

unsigned int p = 0; 

while(my_string_enc[p]) 
    my_string[p] = decoder[my_string_enc[p++]]; 
my_string[p] = '\0'; // null terminating again 
+1

嘿謝謝張貼我可以看到你付出很大的努力,並幫助我瞭解這一點更多謝謝! – Dom

1

這可能是更好的經歷,你希望一次解密一個字符的字符串並更改字符。 這樣:

for (int i = 0; i < fileChars.size(); i++) 
{ 
    for(int j = 0; j < 26; j++){ 
     if(fileChars[i]==indexb[j]){ 
      fileChars[i]=indexa[j]; 
     } 
    } 
} 

這不是與嵌套循環一樣高效,但它的工作。

+1

感謝您的帖子非常有幫助,但我走了一個更有效的方式。 – Dom

相關問題