我正在做一个凯撒块密码。解决方案的一般步骤是:
将您的消息读入一个大缓冲区或字符串对象。
要么删除空格和标点符号(如果你这样做,敌人会更难阅读)。
然后计算消息中的字符。
选择第一个大于消息长度的完美正方形,
分配一个该大小的 char 数组。从左到右,从上到下,将消息读入该大小的方形数组。
从上到下,从左到右写出消息,你就已经
加密了。
我的代码:
#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <ctype.h>
#include <cmath>
#include <functional>
#include <numeric>
#include <algorithm>
#include <locale>
using namespace std;
int main(int argc, char *argv[])
{
int length = 0;
cout << "Enter a string: ";
string buffer;
char buff[1024];
while (getline(cin, buffer))
{
buffer.erase(remove_if(buffer.begin(), buffer.end(), not1(ptr_fun(::isalnum))), buffer.end());
break;
}
length = buffer.length();
int squareNum = ceil(sqrt(length));
strcpy(buff, buffer.c_str());
char** block = new char*[squareNum];
for(int i = 0; i < squareNum; ++i)
block[i] = new char[squareNum];
int count = 0 ;
for (int i = 0 ; i < squareNum ; i++)
{
for (int j = 0 ; j < squareNum ; j++)
{
block[i][j] = buff[count++];
}
}
for (int i = 0 ; i < squareNum ; i++)
{
for (int j = 0 ; j < squareNum ; j++)
{
cout.put(block[j][i]) ;
}
}
return 0;
}
在大多数情况下,它有效。我遇到的问题是当有不止一行输入时。
Ex. 1
this is sample text suitable for a simulation of a diplomatic mission or a spy's instructions
Ex. 2
this is sample text suitable
for a simulation of a diplomatic
mission or a spy's instructions
示例 1 有效,示例 2 无效,因为有多行。我感觉它与 while(getLine) 函数有关,但我不知道要更改什么。