0

我正在创建一个块密码。

它的工作原理是这样的:你计算出需要多大的方形二维数组来保存文本,然后创建并填充从左到右/从上到下书写的文本块,然后从上到下打印出来底部/从左到右。

无论如何,通过注释掉区域进行一些测试,我确定程序遇到了从 for 循环开始的错误,它应该将字符串写入数组。

代码:

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <fstream>
#include <ctype.h>
#include <cstring>
#include <cmath>
#include <string>

using namespace std;

int main(int argc, char *argv[])
{

    string buffer = "";
    string buff2;

    while (getline(cin, buff2))
    {
        buffer.append(buff2);
    }
    for (int i = buffer.length()-1 ; i >=0 ; i--)
        {
            if  ( !isalnum ( buffer[i] )  )
           {
                buffer.erase( i,1 );
           }
        }

    cout << buffer;

    int static length = buffer.length();
    int  squareNum = static_cast <int> ( ceil(sqrt( static_cast <double> ( length ))));


char** block;
block = new char*[squareNum];
for(int i = 0; i < squareNum; i++)
block[i] = new char[squareNum];

int count = 0 ;

    //encounters error here
for (int i = 0 ; i < squareNum ; i++)
{
    for (int j = 0 ; j < squareNum ; j++)
    {
        block[j][i] = buffer[count++];
    }
}

for (int i = 0 ; i < squareNum ; i++)
{
    for (int j = 0 ; j < squareNum ; j++)
    {
        cout.put(block[i][j]);
    }
}

for (int i = 0 ; i < squareNum ; ++i )
delete [] block[i] ;

delete [] block;

}

它可以编译一切,但是当我尝试通过命令提示符运行它时,我遇到了问题。我正在尝试读取 .txt 文件。我无法弄清楚为什么会遇到此错误。任何人都可以阐明这个问题吗?

4

1 回答 1

1

我相信你会发现你的问题是你正在离开缓冲区的尽头。这来自使用“ceil”功能。假设您的输入字符串长度为 17 个字符。这将计算出 5 的“squareNum”。当您尝试从“缓冲区”变量中读取缓冲区 [17](或更大)时,您会得到错误。考虑从您的代码修改的以下片段:

     ...
int count = 0;

for (int i = 0; i < squareNum; i++) {
    for (int j = 0; j < squareNum; j++) {
        if (count < buffer.length()) {
            block[j][i] = buffer[count++];
            }
        else {
            block[j][i] = 0;
            }
        }
    }
      ...

您可能希望调整默认值。

于 2013-11-14T23:24:36.267 回答