прежде всего замените ваш код следующим:
for (q = 0; q < [text length]; q++) {
string = [text substringWithRange:NSMakeRange(q, 1)];
const char *c = [string UTF8String];
NSLog(@"Addr: 0x%X", c);
c = c + increment;
NSLog(@"Addr: 0x%X", c);
NSLog(@"%@", [NSString stringWithUTF8String:c]);
}
Теперь вы можете выяснить вашу проблему. const char * c является указателем. Указатель сохраняет адрес памяти.
Когда я запускаю этот код, первый вывод журнала выглядит так:
Addr: 0x711DD10
, что означает, что символ 'h' из именованной строки NSString со значением @ "h" сохраняется по адресу 0x711DD10 в памяти.
Теперь мы увеличиваем этот адрес на 3. Следующий вывод:
Addr: 0x711DD13
В моем случае по этому адресу есть «0x00». Но не имеет значения, что на самом деле там, потому что «к» там не будет (если вам не очень повезет).
Если вы счастливы, есть и 0x00. Потому что тогда ничего плохого не случится. Если вам не повезло, есть что-то еще. Если есть что-то отличное от 0x00 (или разделитель строк или «конец строки»), NSString попытается преобразовать это. При попытке этого может произойти сбой или может открыться огромная дыра в безопасности.
поэтому вместо манипулирования указателями вы должны манипулировать значениями, на которые они указывают.
Вы можете сделать это так:
for (q = 0; q < [text length]; q++) {
string = [text substringWithRange:NSMakeRange(q, 1)];
const char *c = [string UTF8String]; // get the pointer
char character = *c; // get the character from this pointer address
character = character + 3; // add 3 to the letter
char cString[2] = {0, 0}; // create a cstring with length of 1. The second char is \0, the delimiter (the "end marker") of the string
cString[0] = character; // assign our changed character to the first character of the cstring
NSLog(@"%@", [NSString stringWithUTF8String:cString]); // profit...
}