c ++中的替换密码

时间:2012-07-18 04:54:06

标签: c++ random

我已生成随机文本文件

A B C D E F G H

T W G X Z R L N

我想对我的信息进行编码,以便A = T,B = W,C = G等等。

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int
main ()
{
  string getmsg;

  ifstream openfile ("random.txt");

  if (openfile.is_open ()) {

    while (! openfile.eof ()) {
      getline (openfile,getmsg); //read from random.txt
      cout << getmsg << endl;
    }

  }
}

我被困在这里。

例如。当我输入单词“HAD”时,它将显示“NTX”,并使用相同的随机文本文件,我可以输入“NTX”并给我回“HAD”

3 个答案:

答案 0 :(得分:3)

虽然其他人指出了Map,但我会使用一个大小为26的简单数组(subs)(如果只有大写字母)。

使用0s初始化数组。阅读所有字符及其映射。存储类似subs[char-'A'] = mapped_char的内容。我会把阅读留给你。

修改 -
如果您准备为额外的内存使用付费,只需将subs的大小设为 123 z的ASCII + 1)。

这也将简化subs[char] = mapped_char

的逻辑

答案 1 :(得分:2)

因为这感觉就像家庭作业,我会给你指导而不是解决方案。

您想在输入字符和要输出的相应字符之间创建bijectional映射。

一个可行的方法是使用Map。创建一个以输入字符为关键字的地图,例如'A'及其值作为输出字符,例如'T'。

对于从文件中读入的每个字符,请使用Map查找相应的输出字符。

您需要一次读取一个输入的字符(最简单),或者一次读取一行(就像您现在一样)并逐个字符地遍历每一行,以使用Map进行翻译。 / p>

<强>更新

为了澄清注释中的一点,这是一个双射函数,因为每个原始字符只有一个编码字符。如果不必对文本进行解码,则Map将对该函数的软件表示进行处理。如果需要解码,Bimap更合适。

Injective Function

内射函数

Bijective Function

双射函数

http://en.wikipedia.org/wiki/Injective_function

答案 2 :(得分:0)

这样做的一种方法是

查看std::map<>(在您的情况下为map<char,char>

使用它你可以设置一个字符对的映射,然后当你从文件/缓冲区中读取一个字符时,你可以在地图中查找它并检索相应的字符。

另一种更冗长的方式是使用switch语句

char ch; 
ch << openfile
switch(ch)
{
   case 'A': ch = 'T'; break;
...
}
cout << ch;

还有其他方法,看看你是否能找到一个涉及阵列的方法。