2

我正在做一个凯撒块密码。解决方案的一般步骤是:

  • 将您的消息读入一个大缓冲区或字符串对象。

  • 要么删除空格和标点符号(如果你这样做,敌人会更难阅读)。

  • 然后计算消息中的字符。

  • 选择第一个大于消息长度的完美正方形,
    分配一个该大小的 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) 函数有关,但我不知道要更改什么。

4

2 回答 2

0

你在这里做什么:

while (getline(cin, buffer)) 
{
    buffer.erase(remove_if(buffer.begin(), buffer.end(), not1(ptr_fun(::isalnum))), buffer.end());
    break;
}

每次使用 getline 时都会将新行保存到缓冲区。我的意思是,每次都getline()唤起你buffer的被替换,而不是附加。

尝试这个:

string buffer = "";
string buff2;

// You need to provide some way to let the user stop the input
// e.g. ask him to declare number of lines, or what I recommend
// check for an empty line given, which is implemented below:

while (getline(cin, buff2)) 
    {
        // now pressing [enter] after the last input line stops the loop
        if (buff2.empty())
            break;

        buff2.erase(remove_if(buffer.begin(), buffer.end(), not1(ptr_fun(::isalnum))), buffer.end());
        buffer += buff2;
    }
于 2013-11-14T20:01:51.897 回答
0

可能您应该考虑在擦除后删除中断。

于 2013-11-14T20:16:37.960 回答