vlambda博客
学习文章列表

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