运行程序时C ++字符串下标超出范围

时间:2013-11-14 22:23:22

标签: c++

我正在创建一个块密码。

它的工作方式如下:你弄清楚方形有多大 您需要保存文本的二维数组 使用从左到右的文本写入来创建和填充块 右/上到下,然后从顶部打印出来 从左到右。

无论如何,通过注释区域进行一些测试,我已经确定程序遇到错误,从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文件。我无法弄清楚为什么会遇到这个错误。谁能解释一下这个问题?

1 个答案:

答案 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;
            }
        }
    }
      ...

您可能希望调整默认值。