C# 反向字符串,数组

C# 反向字符串,数组,c#,arrays,string,reverse,C#,Arrays,String,Reverse,我不明白这部分 arr[name.Length-i]=name[i-1]; 让我们有一个5个字符的名称。所以arr的值是4,对吗 然后在循环中,循环变量也采用相同的长度,因此其初始值也将为4 在第一次迭代中,arr[4-4]的值将是arr[0],name[4-1]的值将是name[3],因此arr的第一个索引将与name的第四个索引一起复制 原始名称如何在arr中按相反顺序存储 static void Main(string[] args) { Cons

我不明白这部分

arr[name.Length-i]=name[i-1];
让我们有一个5个字符的
名称
。所以
arr
的值是4,对吗

然后在循环中,循环变量也采用相同的长度,因此其初始值也将为4

在第一次迭代中,
arr[4-4]
的值将是
arr[0]
name[4-1]
的值将是
name[3]
,因此
arr
的第一个索引将与
name
的第四个索引一起复制

原始名称如何在
arr
中按相反顺序存储

static void Main(string[] args)
        {
            Console.Write("What is your name: ");
            var name = Console.ReadLine();

            var arr = new char[name.Length];

            for (var i = name.Length; i > 0; i--)
                arr[name.Length - i] = name[i - 1];

            var reversed = new string(arr);
            Console.WriteLine(reversed);
        }

我在这里复制了原始代码的图像

using System;
                    
public class Program
{
    public static void Main()
    {
        Console.WriteLine("What is your name? ");
        string name = Console.ReadLine();
        var arr = new char[name.Length];
        
        for (var i = name.Length; i > 0; i--){
            arr[name.Length -1] = name[i-1];
        }
        var reversed = new string(arr);
        Console.WriteLine(reversed);
        
    }
}
看起来索引有点不对劲。您希望获取您输入的名称的长度(名称的结尾),并将从结尾开始的字符返回到单词的开头。下面我修改了一些变量名,为代码增加了一些含义

public static void CorrectedMain()
    {
        Console.WriteLine("What is your name? ");
        string name = Console.ReadLine();
        
        char[] reversedLetters = new char[name.Length];
        for (var i = name.Length; i > 0; i--){
            reversedLetters[i-1] = name[name.Length -i ];
        }
        var reversed = new string(reversedLetters);
        Console.WriteLine(reversed);
    }
如果在第一个块中输入Thomas,则返回T,如果在第二个块中运行代码,则返回samohT

这是一把小提琴。
回答您的问题:字符串和数组的索引为零。即,第一个元素位于索引0处。最后一个长度为-1

示例中的代码编写得不是很好。它打破了一些基本的编码原则

  • 向前迭代,除非有非常特殊的需要向后迭代。在这种情况下,没有
  • 在执行任何涉及字符串和数组的代码时,请使用基于零的变量
  • 这个例子打破了这两个,我认为这是它使阅读变得困难的部分原因,但是让我们试试看

    看看迭代,如果长度是你建议的5,那么我从5开始,然后下降到1。当i为5时:(name.Length-i)=0,且i-1=4,因此数组索引0(数组中的第一个)获取位置4处的字符(第5个字符)

    在下一次迭代中,i是4:(name.Length-i)=1,i-1=3,因此数组索引1(数组中的第二个)获取位置3处的字符(第四个字符)

    等等

    这是同一算法的一个稍微好一点的版本。希望它更容易阅读

    public static void Main()
    {
        Console.Write("What is your name: ");
        string name = Console.ReadLine();
        int n = name.Length;
        char[] arr = new char[n];
        for (int i = 0; i < n; i++)
            arr[i] = name[n - 1 - i];
        string reversed = new String(arr);
        Console.WriteLine(reversed);
    }
    
    publicstaticvoidmain()
    {
    控制台。写下(“你叫什么名字:”);
    字符串名称=Console.ReadLine();
    int n=name.Length;
    char[]arr=新字符[n];
    对于(int i=0;i
    请将代码作为文本,而不是图像。您是否在调试器中仔细检查了代码以查看发生了什么?将代码包含为text@LanceU.matthewst这看起来是一种奇怪的方式。一般来说,最好是向前迭代,而不是向后迭代(除非有特殊需要)。另外,在处理数组等时,尽量使用基于零的值,而不是基于1的值。也就是说,您的迭代器变量I应该介于0和name.Length-1之间(而不是name.Lenght-doen到1)。执行这些操作将使代码更简单易读。打印字符
    arr[name.Length-i]
    name[i-1]
    在for循环的每次迭代中,您将了解在反转字符串时到底发生了什么。如果这不能给你一个答案,那么请详细说明你的问题你的代码是否有效?如果是这样的话,你有没有一行一行地,一个字符一个字符地穿过它?如果你这样做,你的问题就会得到回答。如果它不起作用,我希望你有一个或多个一个接一个的错误;这就是在这样的代码中发生的情况