У меня есть предложение, и я хочу проверить дубликаты писем, чтобы добавить 'x' в качестве разделителя между ними, однако я отлаживал и продолжал получать исключение здесь:
for (int i = 0; i < res.Length; i++)
{
t += res[i];
if (res[i] == res[i + 1]) //Index out of range exception here
{
t += 'x';
}
}
что здесь не так?





я +1 мы вызываем это.
в последней итерации i+1 относится к местоположению, которое не находится внутри этого массива.
Лучше изменить условие в цикле for, как показано ниже:
for (int i = 0; i < res.Length - 1; i++)
{
t += res[i];
if (res[i] == res[i + 1]) //Index out of range exception here
{
t += 'x';
}
}
t += res[res.Length -1 ];
Надеюсь это поможет.
получилось, спасибо
Не правильный ответ, но в любом случае удачи.
Кажется, что последний символ не будет добавлен.
@ThePerplexedOne - я согласен, что последний символ не будет добавлен, я обновлю здесь полный код, но вопрос был в основном об исключении из индекса, я считаю, что это отвечает на вопрос.
Однако это не так, не так ли? Потому что вы породили еще одну проблему. Если вы измените for, t += res[i]; никогда не появится для последнего элемента.
Конечно, вы получите это исключение. В случае i=res.Length -1 (что именно является последней позицией) вы запрашиваете res[Length] с i +1, но из-за того, что вы начинаете с 0, запрашиваемый вами элемент не существует. попробуйте что-то вроде
if (i+i < res.Length)
прежде чем вы попросите этот элемент или даже лучше начать считать с i=1 и использовать
if (res[i] == res[i - 1])
{
Nplaintext += 'q';
}
Причина плохого поведения кроется в if:
if (res[i] == res[i + 1])
когда i == res.Length - 1 (последняя итерация цикла for) у вас есть
if (res[res.Length - 1] == res[res.Length])
и res[res.Length] выбрасывает OutOfRangeException, так как допустимый диапазон [0..res.Length - 1] (обратите внимание - 1).
Ваш код исправлен:
for (int i = 0; i < res.Length; i++)
{
Nplaintext += res[i];
// we don't want to check (and insert 'x') for the last symbol
if (i < res.Length - 1 && res[i] == res[i + 1])
{
Nplaintext += 'x';
}
}
Часто мы работаем с string с помощью обычные выражения (пусть .Net зациклится на string за вас):
using System.Text.RegularExpressions;
...
string source = "ABBBACCADBCAADA";
// Any symbol followed by itself should be replaced with the symbol and 'x'
string result = Regex.Replace(source, @"(.)(?=\1)", "$1x");
Console.Write(result);
Исход:
ABxBxBACxCADBCAxADA
Спасибо. Наконец-то кто-то с мозгами. Слишком много ответов, предлагающих изменить for на Length - 1, совершенно не подозревая, что с последним элементом массива ничего не произойдет.
когда
i == res.Length - 1у вас естьres[i + 1]существоres[res.Length], которое вызывает исключение.