我正在做一个Caesar区块密码。解决方案的一般步骤是:
将您的消息读入大缓冲区或字符串对象。
要么删除空格和标点符号(它更难以删除 敌人如果你这样做就读了。
然后计算消息中的字符。
选择大于消息长度的第一个完美正方形,
分配一个大小相同的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)函数有关,但我不确切知道要改变什么。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
“while”循环中的“break” - 它在第一次“getline”调用后打破了循环。这就是为什么你只得到一行。
答案 2 :(得分:0)
可能你应该考虑在擦除后删除中断。