我正在创建一个块密码。
它的工作方式如下:你弄清楚方形有多大 您需要保存文本的二维数组 使用从左到右的文本写入来创建和填充块 右/上到下,然后从顶部打印出来 从左到右。
无论如何,通过注释区域进行一些测试,我已经确定程序遇到错误,从for循环开始,它应该将字符串写入数组。
CODE:
#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文件。我无法弄清楚为什么会遇到这个错误。谁能解释一下这个问题?
答案 0 :(得分:1)
我相信你会发现你的问题是你走出缓冲区的尽头。这来自于使用'ceil'功能。假设您的输入字符串长度为17个字符。这将计算一个5的'squareNum'。当你尝试从'buffer'var读取缓冲区[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;
}
}
}
...
您可能希望调整默认值。