如何修复我的字符串以避免运行时错误?

时间:2019-09-17 08:10:20

标签: c++ arrays string runtime-error

我正在为此问题编写代码https://codeforces.com/contest/118/problem/B 那就是我的解决方案 https://codeforces.com/contest/118/submission/60674349 如您所见,我遇到了运行时错误。

#include <iostream>
#include <stdlib.h>
#include <string>

using namespace std;

int main()
{
    int n, m;
    do
    {
        cin >> n;
    } while (n < 2 || n > 9);
    m = (n * 2) + 1;
    string shape[m];
    for (int i = 0, k, a; i < m; i++)
    {
        if (i == 0 || i == m - 1)
        {
            k = 1;
            a = m - 1;
        }
        else if (i <= n)
        {
            k = (2 * i) + 1;
            a -= 2;
        }
        else
        {
            k -= 2;
            a += 2;
        }

        for (int y = 0; y < a; y++)
        {
            cout << " ";
        }

        for (int j = 0; j < k; j++)
        {
            if (j == 0 || j == k - 1)
            {
                shape[i][j] = '0';
            }
            else if (j <= (k / 2))
            {
                shape[i][j] = shape[i][j - 1] + 1;
            }
            else
            {
                shape[i][j] = shape[i][j - 1] - 1;
            }
            cout << shape[i][j];
            if (j != (k - 1))
            {
                cout << " ";
            }
        }

        cout << endl;
    }
    return 0;
}

我希望它能够提供所需的输出,并且可以!但是我仍然遇到运行时错误,并且..我用谷歌搜索了这个问题,却不知道我需要搜索哪个主题。

2 个答案:

答案 0 :(得分:1)

这里

string shape[m];

形成一个空字符串数组(如果编译器可以容忍VLA,则仍然可以)。这些字符串未使用大小初始化。稍后,当您这样做

shape[i][j] = '0';

您可以在字符串中超出范围的位置设置一个值。相反,您需要一个已初始化的数据结构来保存您要写入的2D数据。您可以将string shape[m];行更改为此,例如:

std::vector<std::vector<char>> shape(m,std::vector<char>(m));

如果相反,您希望将其保留为std::string的数组,则可以这样设置字符串的长度:

for (string &s : shape)
    s.resize(m);

如果您这样做,我建议至少将定义更改为std::vector<std::string> shape(m);,这样它就不再是VLA了,因此更便于移植。

答案 1 :(得分:0)

还要注意这一行和i∈N

k = (2 * i) + 1;

k 始终为奇数。然后你得到了这一行

 else if ( j <= (k / 2)) {

您正在将一个奇数除以2。在这种情况下,请确保编译器完成的下舍入是您所期望的。