-1

我在 c# visual basic 2010 中有以下代码:

for (int i = 7; i > 0; i--)
{
    Char star = '*';
    string numbers = "765432" ;

    //Console.WriteLine(star);

    for (int a = 0; a < i; a++)
    {
        Console.Write(star);
    }
    for (int b =  0; b < i; b++)
    {
        numbers.TrimEnd(numbers[numbers.Length - 1]);
        Console.Write(numbers);
    }
    Console.WriteLine();   
}
Console.ReadLine();   

我期待结果: *765432 在屏幕上重复 7 次,但我得到:

*****765432765432765432765432765432

****765432765432765432765432

***765432765432765432

**765432765432

*765432

(我无法显示完整的结果,因为它没有在屏幕上正确返回,但基本上是变量星号和数字在第 1 行显示 7 次,在第 2 行显示 6 次等,直到第 7 行显示一次)

我的理解是,在 for 循环中声明的aandb变量应该指示输入 for 循环的次数,为什么要写入 star 和 numbers 变量 7 次然后 6 次以匹配循环输入的次数? 特别是当它们被初始化为*and时765432

4

5 回答 5

4

这就是问题所在(我怀疑,无论如何 - 这肯定是一个问题):

numbers.TrimEnd(numbers[numbers.Length - 1]);

字符串在 .NET 中是不可变的。TrimEnd不会更改现有字符串 - 它返回对新字符串的引用。正如文档中强调的那样:

此方法不会修改当前实例的值。相反,它返回一个新字符串,在该字符串中找到的所有尾随字符trimChars都从当前字符串中删除。

为简单起见,您最好使用Substring“删除”最后一个字符:

numbers = numbers.Substring(0, numbers.Length - 1);

或者确实Remove

numbers = numbers.Remove(numbers.Length - 1);

...虽然这实际上会在第 7 次迭代中失败,因为此时字符串将为空。这并不是你真正想要达到的目标,但我认为你需要退后一步,仔细考虑过程中的每一步。

于 2013-09-24T21:42:50.853 回答
2

TrimEnd返回一个新字符串,它不会修改原始字符串。您必须将其分配回号码。字符串是不可变的。

number = numbers.TrimEnd(numbers[numbers.Length - 1]);

在索引其元素之前检查字符串长度。在您的 for 循环中,您可以添加如下条件:

for (int b = 0; b < i && numbers.Length > 0; b++)
于 2013-09-24T21:42:47.933 回答
1

不。'a' for 循环运行,输出那么多星,'b' for 循环接下来运行,输出那么多字符串。如果你只是想让'*765432'重复7次,你需要改变

for (int a = 0; a < i; a++)
{
Console.Write(star);
}
for (int b =  0; b < i; b++)
{
numbers.TrimEnd(numbers[numbers.Length - 1]);
Console.Write(numbers);
}

for (int a = 0; a < 7; a++)
{
Console.Write(star);
Console.Write(numbers);
} 

并取出父循环;这就是给你越来越短的线条的原因。

于 2013-09-24T21:48:08.843 回答
0

在这种情况下,您永远不需要使用TrimEnd()多个 for 循环。

  public static void Main()
        {
            for (int i = 7; i > 0;i--)
            {
                char star = '*';
                string numbers = "765432";
                Console.WriteLine(star + numbers);

            }
            Console.ReadLine();
        }

输出:

*765432
*765432
*765432
*765432
*765432
*765432
*765432
于 2014-10-29T02:19:14.613 回答
0

这会产生您期望的输出:

for (int i = 0; i < 7; i++)
{
    Char star = '*';
    string numbers = "765432" ;

    Console.WriteLine(star);
    Console.Write(numbers);
    Console.WriteLine();   
}

我期待结果:*765432 在屏幕上重复 7 次

于 2013-09-24T21:49:26.603 回答