我正在为此问题编写代码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;
}
我希望它能够提供所需的输出,并且可以!但是我仍然遇到运行时错误,并且..我用谷歌搜索了这个问题,却不知道我需要搜索哪个主题。
答案 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。在这种情况下,请确保编译器完成的下舍入是您所期望的。