C语言 打印字母等腰三角形 A-Z

问题遇到的现象和发生背景

C语言 打印字母等腰三角形 A-Z

img

用代码块功能插入代码,请勿粘贴截图
#include
int main()
{
    int n,i,j,k,m,s=0,q=0;
    char a,b,c;
    scanf("%d %c",&n,&a);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n-i;j++)
        {
            printf(" ");
        }
        for(k=0;k<=i-1;k++)
        {
            b=a+i+k-1;
            
            while(b>=91)
            {
            b=b-26;
            s++;
            }
            
            printf("%c",b);    printf(" ");
        }
        for(m=1;m<=i-1;m++)
        {
            c=b-m;
            while(c<65)
            {
            c+=26;
            q++;
            }
            printf("%c",c);
        }
    printf("\n");
    }

    return 0;
}

运行结果及报错内容

img

不知道为什么会在K之后出现乱码,无论输入是什么都是在这个位置出错

乱码的原因为代码15行b=a+i+k-1;的值可能会为128超出b(char)的范围-128到127,导致符号位变化产生负值。
解决方法可以将b定义为int类型。
修改后的代码如下
(看题目预览好像字母间不需要空格,就把字母间空格也删掉了)

#include<stdio.h>
int main()
{
    int n,i,j,k,m,s=0,q=0,b;
    char a,c;
    scanf("%d %c",&n,&a);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n-i;j++)
        {
            printf(" ");
        }
        for(k=0;k<=i-1;k++)
        {
            b=a+i+k-1;                // 原来b为char类型,若值超过128则会将符号位置成1,使得整体值变为负值
            while(b>=91)    
            {
                b=b-26;
                s++;
            }
            printf("%c",b);
        }
        for(m=1;m<=i-1;m++)
        {
            c=b-m;
            while(c<65)
            {
            c+=26;
            q++;
            }
            printf("%c",c);
        }
    printf("\n");
    }
    return 0;
}

运行截图

img