2011-10-29 7 views
2

私はShift Cipherを実装しようとしています。つまり、文字列内のすべての文字を量だけシフトします。私が正しく書いたメソッドは最初の文字を置き換えますが、2回目の反復ではRange out of boundsの例外がスローされます。Shift Cipher Range 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を使用しているので、2番目の反復では、文字列の最後を過ぎた文字を要求しています。範囲は{i、1}でなければなりません。

関連する問題