我正在尝试实现一个Shift Cipher,这意味着,将一个字符串中的每个字符移动一个数量。我写的方法正确地替换了第一个字母,但在第二次迭代时它抛出了Range out of bounds
异常。
original = @"rt"
第一次r
被w
取代。 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;
}
答案 0 :(得分:1)
NSRange有一个位置和一个长度。您使用i + 1作为长度,因此在第二次迭代中,您要求字符串结束后的字符。你的范围应该是{i,1}。