2011-10-29 2 views
2

시프트 암호를 구현하려고합니다. 즉, 문자열의 모든 문자를 양만큼 이동합니다. 필자가 올바르게 작성한 메서드는 첫 번째 문자를 대체하지만 두 번째 반복에서는 Range out of bounds 예외가 발생합니다.범위 밖의 시프트 암호 범위

original = @"rt" 처음으로 rw으로 바뀝니다. t은 두 번째로 y으로 대체되지 않습니다.

shift = 5

#define LETTER_POS 97 
#define ALPHABET_LENGTH 26 

- (NSString*)encode:(NSString*)original withShift:(int)shift { 

    NSMutableString* encoded = [NSMutableString stringWithString:original]; 
    for (int i=0; i < [encoded length]; i++) { 
     char oriChar = [encoded characterAtIndex:i]; 
     if (oriChar == ' ') { 
      continue; 
     } 
     char encChar = ((oriChar - LETTER_POS) + shift) % ALPHABET_LENGTH + LETTER_POS; 
     NSRange range = {i, i+1}; 
     [encoded replaceCharactersInRange:range withString:[NSString stringWithFormat:@"%c" , encChar]]; 

    } 
    return encoded; 

} 

답변

1

NSRange는 위치 및 길이를 갖는다. i + 1을 길이로 사용하므로 두 번째 반복에서 문자열 끝에 지나가는 문자를 묻습니다. 범위는 {i, 1}이어야합니다.