Как отладить System.ArgumentOutOfRangeException ошибка в C #? - PullRequest
0 голосов
/ 07 мая 2018

Предполагается, что этот код берет две выборки, одну оригинальную и одну новую, а затем определяет длину наименьшего единственного последовательного фрагмента, который был вставлен в первую последовательность.

При попытке попробовать несколько примеров я получаю следующее сообщение об ошибке:

System.ArgumentOutOfRangeException: 'Индекс и длина должны ссылаться на место в строке Имя параметра: длина

Вот код:

class Program
{

    static void Main(string[] args)
    {
        Console.WriteLine(GetSample());
        Console.ReadKey();
    }

    public static int GetSample()
    {
        string sample1 = Console.ReadLine();
        string sample2 = Console.ReadLine();


        if (sample1 == sample2) return 0;

        if (sample1.Length >= sample2.Length)
        {
            for (int i = 0; i < sample2.Length; i++)
            {
                if (!(sample1[i] == sample2[i]))
                {

                    sample1 = sample1.Substring(i, sample1.Length);
                    sample2 = sample2.Substring(i, sample2.Length);
                    break;
                }
            }

            int var = sample1.Length - sample2.Length;
            for (int i = sample2.Length - 1; i >= 0; i--)
            {
                if (sample2[i] == sample1[i + var])
                    sample2 = trimlast(sample2);
            }
        }
        else
        {
            for (int i = 0; i < sample1.Length; i++)
            {
                if (!(sample1[i] == sample2[i]))
                {
                    sample1 = sample1.Substring(i, sample1.Length);
                    sample2 = sample2.Substring(i, sample2.Length);
                    break;

                }
            }
            int var = sample2.Length - sample1.Length;
            for (int i = sample1.Length - 1; i >= 0; i--)
            {
                if (sample2[i + var] == sample1[i])
                    sample2 = trimlast(sample2);
            }
        }
        return sample2.Length;

    }
    public static string trimlast(string str)
    {
        return str.Substring(0, str.Length - 1);
    }
}

}

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Один из ваших циклов пытается получить доступ к элементу, который не существует. Например, у вас есть массив a = {1,2,3}, вы пытаетесь получить доступ к четвертому элементу, который не существует.

Если вы не можете выяснить, где именно может возникнуть проблема, попробуйте использовать операторы print внутри ваших циклов, отображая значения счетчика (i). Он укажет, для какой итерации ваш код не выполняется.

0 голосов
/ 07 мая 2018

Проблема:

sample1 = sample1.Substring(i, sample1.Length);

и другие подобные вызовы методов. Второй параметр Substring - это длина (т. Е. Количество символов, извлекаемых для подстроки). Таким образом, если i больше 0, в этом случае произойдет сбой, поскольку метод попытается получить символы, которых нет в строке.

...