C语言学习|打印对称字母金字塔
C 语言学习,用 C 语言打印字母对称金字塔。
这次想用malloc
的动态方式实现,把需要打印的每一行放在一个字符串数组里面。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int n = 10; // 打印的行数
char *stars = (char *)malloc(2 * n * sizeof(*stars));
memset(stars, ' ', 2 * n * sizeof(*stars) - 1);
stars[2 * n - 1] = '\0';
char *starsRow = (char *)malloc(2 * n * sizeof(*stars) * n);
char midChar = 'A';
for (int i = 0; i < n; i++) {
stars[((strlen(stars) + 1) / 2) - 1] = midChar;
// 前一个字符是后一个字符的ASCII码减1 或 后一个字符是前一个字符的ASCII码减1
for (int j = 1; j <= i; j++) {
stars[(((strlen(stars) + 1) / 2) - 1) - j] = stars[(((strlen(stars) + 1) / 2) - 1) - j + 1] - 1;
stars[(((strlen(stars) + 1) / 2) - 1) + j] = stars[(((strlen(stars) + 1) / 2) - 1) + j - 1] - 1;
}
midChar++; // ASCII码加1
memcpy(starsRow + (strlen(stars) + 1) * i, stars, strlen(stars) + 1);
}
for (int i = 0; i < n; i++){
printf("%s\n", starsRow + (strlen(stars) + 1) * i); // 字符串遇见‘\0’会自动结束
}
for (int i = n -2; i >= 0; i--) {
printf("%s\n", starsRow + (strlen(stars) + 1) * i);
}
free(stars);
stars = NULL;
free(starsRow);
starsRow = NULL;
return 0;
}
输出:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDEFEDCBA
ABCDEFGFEDCBA
ABCDEFGHGFEDCBA
ABCDEFGHIHGFEDCBA
ABCDEFGHIJIHGFEDCBA
ABCDEFGHIHGFEDCBA
ABCDEFGHGFEDCBA
ABCDEFGFEDCBA
ABCDEFEDCBA
ABCDEDCBA
ABCDCBA
ABCBA
ABA
A