画一个字母组成的菱形(关键词-for)

输入顶行字符和图形的高,输出如图所示图形。

例如顶行字符为 ' A ' ,图形的高为 5

          A

        B   B

      C     C

    D         D

   E            E

    D         D

      C    C

        B B

         A
#include<stdio.h>
int main()
{
    int m,n,i,j,a,b;
    scanf("%c,%d",&j,&i);
    for(m=1;m<=2*i-1;m++)
    {
        if(m<=i)
        {
            a=i-m,b=2*m-1;
        }
        else
        {
            a=m-i,b=4*i-2*m-1;
        }
        for(n=1;n<=a;n++)
        {
            printf(" ");
        }
        for(n=1;n<=b;n++)
        {
            if(m<=i)
            {
                if(n==m||n==2*i-m)
                {
                    printf("%c",j);
                }
                else
                {
                    printf(" ");
                }
                j++;
                printf("\n");
            }
            else
            {
                if(n==m||n==2*i-m)
                {
                    printf("%c",j);
                }
                else
                {
                    printf(" ");
                }
                j--;
                printf("\n");
            }
            
        }
    }
    return 0;
}

哪里出现了错位,请指正,谢谢

#include <stdio.h>
int main() {
    int h;
    char c;
    scanf("%c,%d", &c, &h);
    int i = 1, num = 0;  //i记录我们在分析时指定的循环变量、num记录已经输出的行数
    int flag = 0;  //flag = 0 表示正在输出上半部分(包含最中间行)、否则表示正在输出下半部分
    /* 循环输出 2h - 1 行 */
    while (num < 2 * h - 1) {
        /* 输出首尾两行的情况 */
        if (i == 1) {
            for (int j = 0; j < h - i; j++) 
                printf(" ");
            printf("%c", c);
            for (int j = 0; j < h - i; j++) 
                printf(" ");
            printf("\n");
        }
        else {
            for (int j = 0; j < h - i; j++) 
                printf(" ");
            printf("%c", c);
            for (int j = 0; j < 2 * i - 3; j++)  
                printf(" ");
            printf("%c", c);
            for (int j = 0; j < h - i; j++)
                printf(" ");
            printf("\n"); 
        }
        if (i >= h)  //当已经输出了最中间的一行
            flag = 1; //将flag设置为1
        /* 在输出上半部分的时候 */
        if (flag == 0) {
            i++;
            c++;
        }
        /* 在输出下半部分的时候 */
        else {
            i--;
            c--;
        }
        num++;  //累加行数
    }
}