You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中实现字符字符串的居中对齐?——解决指定星号序列的居中排版问题

我来帮你搞定这个居中对齐的问题!你的思路其实已经找对方向了,只是少了给每行添加前置空格的关键步骤,让星号能在固定宽度的行里居中显示。

核心思路

因为你要生成的最大行是n个星号(n是奇数),所以我们可以把每行的总宽度固定为n。对于任意一行有k个星号(k也是奇数),需要的前置空格数是(n - k) / 2——由于n和k都是奇数,相减的结果是偶数,除以2刚好能得到整数个空格,完美实现居中。

修改后的代码

我调整了你的代码,添加了空格计算的逻辑,同时优化了换行的处理(用Environment.NewLine更适配不同操作系统):

public string GenerateCenteredAsterisks(int n)
{
    var asterickString = new List<string>();
    // 边界判断:n必须是大于等于1的奇数
    if (n % 2 == 0 || n < 1) return null;
    
    // 生成从1到n的奇数行(递增部分)
    for (var i = 1; i <= n; ++i)
    {
        if (i % 2 != 0)
        {
            int leftSpacesCount = (n - i) / 2;
            string leftSpaces = new string(' ', leftSpacesCount);
            string starLine = leftSpaces + new string('*', i);
            asterickString.Add(starLine);
        }
    }
    // 生成从n-1到1的奇数行(递减部分)
    for (var j = n - 1; j >= 1; --j)
    {
        if (j % 2 != 0)
        {
            int leftSpacesCount = (n - j) / 2;
            string leftSpaces = new string(' ', leftSpacesCount);
            string starLine = leftSpaces + new string('*', j);
            asterickString.Add(starLine);
        }
    }
    // 用换行符拼接所有行并返回
    return string.Join(Environment.NewLine, asterickString);
}

额外小技巧

如果你想让每行的星号左右都有空格(总长度严格等于n),可以在星号后面再加上同样数量的空格:

string starLine = leftSpaces + new string('*', i) + leftSpaces;

这样生成的每行总长度都是n,视觉上会更对称。

关于string.Format的补充

你之前说string.Format不支持居中,其实它可以通过间接方式实现,比如:

string starLine = string.Format("{0," + n + "}", new string('*', i).PadLeft((n + i) / 2));

不过对于你的场景,直接计算空格数的方式更直观好懂,和你原有的代码风格也更匹配。

内容的提问来源于stack exchange,提问作者Godfrey Owidi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 18:44:10