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

C++ C++;运行程序时字符串下标超出范围,c++,C++,我正在创建一个区块密码 它的工作原理是这样的:你计算出一个正方形有多大 二维数组需要保存文本,然后 创建并用从左到右的文字书写填充块 从右/上到下,然后从上到下打印 底部/从左到右 无论如何,通过注释掉区域进行一些测试,我已经确定程序遇到了从for循环开始的错误,在那里它应该将字符串写入数组 代码: #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; int main(int argc,char*argv[]) { 字符串缓冲区=”; 字符串2; whi

我正在创建一个区块密码

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

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

代码:

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
字符串缓冲区=”;
字符串2;
while(getline(cin,buff2))
{
buffer.append(buff2);
}
对于(int i=buffer.length()-1;i>=0;i--)
{
if(!isalnum(缓冲区[i]))
{
缓冲区。擦除(i,1);
}
}

cout我相信您会发现,您的问题在于您正在离开缓冲区的末尾。这来自于使用“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;
            }
        }
    }
      ...
。。。
整数计数=0;
对于(int i=0;i

您可能希望调整默认值。

我认为您正在访问
buffer
的范围是
0
ceil(sqrt(buffer.length())^2
,该范围可以大于最大有效索引
buffer.length()-1
     ...
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;
            }
        }
    }
      ...