2017-03-05 5 views
0

내 목표는 상자에 텍스트를 삽입하고 값을 알파벳의 이동 값으로 선택하고 암호화 된 출력을 얻는 것입니다.카이저 암호를 사용하여 텍스트 암호화 C#

저는 C#으로 시작했는데이 운동을 발견했습니다. 이것은 내가 잘못 생각한 것입니다.이 오류 메시지는 "실행되지 않을 때 'System.IndexOutOfRangeException'유형의 처리되지 않은 예외가 발생했습니다. 어디서 오류인지 알지만 문제를 해결하는 방법을 모르겠습니다. 나는 내가 뭘 잘못하고 있는지 또는 내가하는 일이 옳다는 것을 알고 싶다.

미리 감사드립니다.

private void cifrar_Click(object sender, EventArgs e) 
    { 
     string input = message.Text; 

     int shift = int.Parse(shifting.Text); 

     char[] alphabet = new char[26] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; 

     string output_text = ""; 

     char[] input_array = input.ToCharArray(); 

     for (int i = 0; i < alphabet.Length; i++) 
     { 
      for (int j = 0; j < input_array.Length; j++) 
      { 
       if (input_array[j] == alphabet[i]) 
        input_array[j] = alphabet[i + shift]; 
      }      
     } 

     output_text = new string(input_array); 

     output.Text = output_text; 
    } 

    } 

}

답변

2

당신이 배열의 요소 수보다 높은 새 값을 얻을 수 있습니다 i-shift를 추가. 이 색인을 사용하여 배열에 액세스하려고하면 IndexOutOfRangeException이됩니다.

modulo operator을 사용하여 인덱스를 유효한 범위 내에 포함 시키십시오.

input_array[j] = alphabet[(i + shift) % alphabet.Length]; 

는 또한 논리를 조금 변경해야

for (int j = 0; j < input_array.Length; j++) 
{ 
    for (int i = 0; i < alphabet.Length; i++) 
    { 
     if (input_array[j] == alphabet[i]) 
     { 
      input_array[j] = alphabet[(i + shift) % alphabet.Length]; 
      break; 
     } 
    } 
}      

내가 내부 및 외부 루프를 교환하고 또한 break 문을 추가했다. 이는 암호가 입력 문자열의 동일한 위치에 여러 번 적용되지 않도록하는 데 필요합니다.

+0

더 이상 오류 메시지를 표시하지 않지만 출력이 잘못되었습니다. 예 : 대문자 만 확인하기 때문에 시프트 값 = 2 입력 = 하이 출력 내가 갖는 = 동성 그것은 "JK" –

+0

@DiogoCarvalho해야한다. 소문자는 수정되지 않습니다. 입력을 먼저 대문자로 변환하십시오. – NineBerry

+0

"HI"입력을 넣더라도 출력이 잘못되었습니다. 나에게 "BA"를주고있다. 하지만 그래, 또한 입력을 변환 잊어 버린 덕분에 –