我试图用ASCII绘制一个简单的形状,当我尝试绘制一个简单的三角形时,我的最后一行总是被省略。你能帮我个忙吗?也许我错过了什么?
static void set_char_at(char* mat, int cols, int x, int y, char c)
{
mat[x*cols+y] = c;
}
int test3()
{
int n;
cin >> n;
char* mat = new char[(n*n)]; // newlines
for(int i=0; i < n*n; i++) {
mat[i] = ' ';
}
for(int i=0; i <= n; i++) {
for(int j=0; j < i; j++) {
set_char_at(mat, n, i, -j, '^');
}
set_char_at(mat, n, i, 0, '\n');
}
cout << mat;
}
编辑:输入为5,所需输出为:
^
^^
^^^
^^^^
^^^^^
在屏幕的右端看到。我错过了&#34; ^&#34;。
的最后一行答案 0 :(得分:2)
char* mat = new char[(n*n)]; // newlines
for(int i=0; i < n*n; i++)
mat[i] = ' ';
可以说n
为1.数组mat
的大小为1*1
。这可以容纳1个字符。在C ++中,字符串(不是std :: string)是由nul字节终止的字符数组,需要N + 1个字节。
char* mat = new char[(n*n) + 1];
for(int i=0; i < n*n; i++)
mat[i] = ' ';
mat[n*n] = 0;
如果n
为2,请回到您的代码:
for(int i=0; i <= n; i++) {
for(int j=0; j < i; j++) {
set_char_at(mat, n, i, -j, '^');
}
这将致电:
set_char_at(mat, n, 1, -0, '^'); => mat[1*2-0] => 2
set_char_at(mat, n, 2, -0, '^'); => mat[2*2-0] => 4
set_char_at(mat, n, 2, -1, '^'); => mat[2*2-1] => 3
请注意右侧的索引,循环中还有一行:
for(int i=0; i <= n; i++) {
for(int j=0; j < i; j++) {
set_char_at(mat, n, i, -j, '^');
}
set_char_at(mat, n, i, 0, '\n');
这转换为:
set_char_at(mat, n, 1, -0, '^'); => mat[1*2-0] => 2
set_char_at(mat, n, 1, 0, '\n'); => mat[1*2+0] => 2
set_char_at(mat, n, 2, -0, '^'); => mat[2*2-0] => 4
set_char_at(mat, n, 2, -1, '^'); => mat[2*2-1] => 3
set_char_at(mat, n, 2, 0, '\n'); => mat[2*2+0] => 4
你需要留出回车的空间:
#include <iostream>
void testf(size_t n)
{
const size_t matSize = (n+1) * n + 1;
char* mat = new char[matSize] {};
for (size_t i = 0; i < matSize - 1; ++i)
mat[i] = ' ';
mat[matSize - 1] = 0;
for (size_t i = 0; i < n; ++i) {
for (size_t j = 0; j <= i; ++j)
mat[i*(n+1)+(n-j-1)] = '^';
mat[i*(n+1) + n] = '\n';
}
std::cout << "--- start " << n << "\n";
std::cout << mat;
std::cout << "--- end\n";
}
int main()
{
testf(4);
}
答案 1 :(得分:0)
for(int i=0; i <= n; i++) {
你应该在这里使用less运算符(&lt;),因为你的x坐标来自[0,n-1]。
set_char_at(mat, n, i, -j, '^');
你的y cooridinate似乎也来自[0,n-1],所以只是-j不是 一个不错的选择,也许你的意思是n-j?
set_char_at(mat, n, i, 0, '\n');
您可能希望为换行符(\ n)添加第n + 1列。
char* mat = new char[(n*n)]:
在这种情况下,您必须为(n + 1)* n而不是n * n标注尺寸。 然后x = n将是一个有效的参数。
cout << mat;
您将字符数组用作字符串。在这种情况下,您必须在数组中添加0作为最后一个字符。而且你必须在维度中添加一个,所以它应该看起来像
char* mat = new char[(n+1)*n + 1];
答案 2 :(得分:0)
您正在此行set_char_at(mat, n, i, 0, '\n');
覆盖前一个字符“^”。我的意思是,当j = 0时,执行set_char_at(mat, n, i, 0, '^');
行,然后执行set_char_at(mat, n, i, 0, '\n');