2015-07-02 2 views
0

Я пытаюсь выполнить строковые манипуляции. Вот мой C# код:Преобразование «int» в «char» внутри массива char

static void Main(string[] args) 
{ 
    string input; 
    string output; 
    int length; 

    Console.WriteLine("input = "); 
    input = Console.ReadLine(); 
    length = input.Length; 

    if ((input != "") || (length != 0)) 
    { 
     Random randem = new Random(); 
     int i = -1; //because I do not want the first number to be replaced by the random number 
     char[] characters = input.ToCharArray(); 
     while (i < length) 
     { 
      int num = randem.Next(0, 9); 
      char num1 = Convert.ToChar(num); 
      i = i + 2; //so that every next character will be replaced by random number.. :D 
      characters[i] = num1; //*error* here 
     } 
     output = new string(characters); 
     Console.WriteLine(output); 
    } 

Например:

вход пользователя: "i_love_to_eat_fish"

Желаемый результат: "i2l4v1_9o5e8t7f8s2"

уведомление о том, что только неизменным символ в полукокса [] символов: "ilv _ oetfs". (Требуемый выход из программы)

Я уже пробовал использовать этот код, но до сих пор, постоянно получаю сообщение об ошибке при characters[i] = num1;

Есть ли я на правильном пути?

+0

Что ошибка? Это ArgumentOutOfRange? – juharr

+0

IndexOutOfTheRangeException – Marshal

ответ

2

Я предполагаю, что ошибка, которую вы получаете, это IndexOutOfRangeException, это из-за i = i + 2;. while гарантирует, что i составляет менее length, но при добавлении 2 это может быть больше. Просто добавьте проверку, что она не находится за пределами length.

i = i + 2; 
if(i < length) 
    characters[i] = num1; 

Или просто перейдите на цикл for.

Random randem = new Random(); 
char[] characters = input.ToCharArray(); 
for(int i = 1; i < length; i += 2) 
{ 
    int num = randem.Next(1, 10); // max value is exclusive 
    char num1 = num.ToString()[0]; 
    characters[i] = num1; 
} 
output = new string(characters); 
Console.WriteLine(output); 

Кроме того, как Shar1er80 указывает, что вы в настоящее время преобразования цифры в char, который имеет такое же значение ASCII, а не фактические символы, которые представляют цифру. Цифры 0-9 представлены значениями 48-57.Вы можете изменить вызов Random.Next быть:

int num = randem.Next(48, 58); // The upper bound is exclusive, not inclusive 
char num1 = (char)num; 

Или, как Shar1er80 делает это

int num = randem.Next(0,10) // Assumming you want digits 0-9 
char num1 = num.ToString[0]; 

Также обратите внимание, что максимальное значение для Random.Next является эксклюзивным, так что если вы хотите включить возможность использования a 9 вы должны использовать верхнюю границу, которая на 1 больше, чем наибольшее значение, которое вы хотите.

1

его, потому что вы начинаете с индекса -1, а символы не содержат индекс -1.

EDIT: К сожалению, не тот corrct ответ он должен быть while(i < length - 2)

+0

Но в цикле OP делает 'i = i + 2;', поэтому первый индексный удар будет равен 1. – juharr

1

Ошибка вы получаете это IndexOutOfTheRangeException, что объясняет Everthing в себе.

Это означает, что индекс вы подаете в массив в цикле выходит за пределы его length-1 (как массивы имеют 0-индексирование)

Так что, когда вы делаете i+2, вам нужно проверить, если i+2 не превышает i.length-1 в любой момент времени; который делает в вашей петле.

В общем просто проверить, если вы поставляют индексы между 0 and Array.Length-1

2

Всякий раз, когда вы достигнете i = 17 добавлении 2 к i. Это составляет i = 19 с длиной входного сигнала, равной 18, что вызывает исключение вне диапазона.

+0

спасибо, chris! это сработало! : D – rydev

1

Изменение этой линии

char num1 = Convert.ToChar(num); 

Для

char num1 = num.ToString()[0]; 

... Перевести

characters[i] = num1; 

В одном случае блок

if (i < length) 
    characters[i] = num1; 
Смежные вопросы