Невозможно перевернуть строку, используя цикл for - PullRequest
0 голосов
/ 17 ноября 2018

Мне нужно перевернуть строку, используя цикл for, но я просто не могу этого сделать.Что я делаю не так?

class Program
{
    static void Main(string[] args)
    {
        string s;
        string sReverse;

        Console.WriteLine("Say any word please: ");
        s = Console.ReadLine();

        for (int i = 0; i < s.Length; i++)
        {
            s[s.Length - i] = sReversa[i];
        }
    }
}

Ответы [ 6 ]

0 голосов
/ 17 ноября 2018

Если вам нужно использовать цикл for так, как вы хотите, вам нужно будет выделить новый массив символов, инициализировать его символами строки «спереди назад», а затем воспользоваться конструктором string, который принимает массив символов в качестве входных данных. Код выглядит следующим образом:

public static string ReverseWithFor(string s)
{
    if (string.IsNullOrEmpty(s)) return s;
    char[] a = new char[s.Length];
    for (int i = 0; i < s.Length; i++)
        a[s.Length - 1 - i] = s[i];
    return new string(a);
}
0 голосов
/ 17 ноября 2018

Самый простой способ заставить ваш код работать с минимальными изменениями - это использовать StringBuilder.В отличие от string a StringBuilder является изменяемым.

Вот код:

Console.WriteLine("Say any word please: ");
string s = Console.ReadLine();

StringBuilder sb = new StringBuilder(s);

for (int i = 0; i < s.Length; i++)
{
    sb[s.Length - i - 1] = s[i];
}

string r = sb.ToString();
0 голосов
/ 17 ноября 2018
string reverse = string.Join("", "some word".Reverse());
0 голосов
/ 17 ноября 2018

Это будут минимальные изменения, требуемые в вашем коде:

public static void Main()
    {
        string s;
        string sReverse = string.Empty;   // Initialise (always recommended)

        Console.WriteLine("Say any word please: ");
        s = Console.ReadLine();

        for (int i = s.Length-1; i >=0 ; i--)  // Chnage the order of indexing
        {
            sReverse += s[i];   // makes a new string everytime since strings are immutable.
        }
        Console.WriteLine(sReverse);  // print your new string
    }

Как говорили другие, это может быть не лучшим подходом для очень большого числа манипуляций / формирования струн. Вместо этого используйте StringBuilder .

StringBuilder подходит в ситуациях, когда необходимо выполнить повторные изменения строки, связанные с создание нового String объекта может быть дорогостоящим.

Ниже приведен фрагмент использования StringBuilder :

using System;
using System.Text;  // Add this for StringBuilder               
public class Program
{
    public static void Main()
    {
        string s;
        StringBuilder sReverse = new StringBuilder();  // Instantiate the object.

        Console.WriteLine("Say any word please: ");
        s = Console.ReadLine();

        for (int i = s.Length-1; i >=0 ; i--)
        {
            sReverse.Append(s[i]);  // Keep Appending to original string.
        }
        Console.WriteLine(sReverse.ToString());  // finally convert to printable string.
    }
}
0 голосов
/ 17 ноября 2018

Вы не можете использовать s[s.Length - i] = sReversa[i]; Потому что Strings неизменны. Вместо этого вы можете использовать sReverse = sReverse + s[Length];

Следующий код даст вам обратную строку:

 static void Main(string[] args)
    {
        string s;
        string sReverse = "";
        int Length;

        Console.WriteLine("Say any word please: ");
        s = Console.ReadLine();
        Length = s.Length - 1;

        for (int i = Length; i >= 0; i--)
        {
            sReverse = sReverse + s[Length];
            Length--;

        }

        Console.WriteLine("{0}", sReverse);
        Console.ReadLine();
    }

Примечание: Для большого количества итераций это может быть проблемой производительности.

0 голосов
/ 17 ноября 2018

Строки неизменны.Вы не можете изменять их символ за символом.

Если вам нужен произвольный доступ к символам в строке, сначала преобразуйте его в массив символов (используя ToCharArray), а затем преобразуйте его обратно, когда выГотово (String имеет конструктор, который принимает массив символов).

string a = "1234";
char[] b = a.ToCharArray();
b[1] = 'X';
a = new string(b);
Console.WriteLine("{0}", a);

Вывод:

1X34

Есть намного более простые способы обратить строку (например, LINQ позволит вамdo var output = new string(input.Reverse().ToArray());), но если вы хотите использовать цикл for и ваш текущий подход, это, вероятно, та часть информации, которую вам не хватает.

...