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)是一個由空字節結尾的字符數組,它需要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
注意在右手邊的指標,還有一個更行你loop:
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);
}
現場演示:http://ideone.com/mhY7iS
什麼是你輸入你的實際輸出與您預計的輸出? –
爲什麼這個標籤C?源代碼是C++。 –
更改了它,謝謝 –