我的程序只处理来自输入的一行

时间:2013-11-14 19:52:33

标签: c++

我正在做一个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)函数有关,但我不确切知道要改变什么。

3 个答案:

答案 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)

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