移动密码范围超出界限

时间:2011-10-29 17:39:03

标签: objective-c string cocoa nsstring

我正在尝试实现一个Shift Cipher,这意味着,将一个字符串中的每个字符移动一个数量。我写的方法正确地替换了第一个字母,但在第二次迭代时它抛出了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 个答案:

答案 0 :(得分:1)

NSRange有一个位置和一个长度。您使用i + 1作为长度,因此在第二次迭代中,您要求字符串结束后的字符。你的范围应该是{i,1}。