две простые строковые операции в target-c (сдвиг и итерация) - PullRequest
0 голосов
/ 23 октября 2011

Я хочу манипулировать NSString в obj-c, вот что я хочу сделать:

итерация строки через цикл for-each / for и сдвиг влево (<<) каждого символа NSString, но яне знаю, как я должен перебирать символы NSString и как использовать оператор сдвига в obj-c. </p>

Я довольно новый в target-c.

regards

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

Код:

NSString * string = @"Anne";
int length = [string length];
for(int index = 0; index < length; index++) {
    unichar character = [string characterAtIndex:index];
    NSLog(@"%C",character);
}

Выход:

A
n
n
e
1 голос
/ 23 октября 2011

NSString с неизменяемы; mutableCopyWithZone: даст вам ( неявно удерживается ) NSMutableString. Однако NSMutableString не имеет способа установки отдельных символов. Было бы проще получить массив символов, используя один из множества методов (например, getCharacters:range: для широких символов или cStringUsingEncoding:, getCString:maxLength:encoding: или UTF8String для строк в стиле c), затем оперируйте этим (обратите внимание, некоторые методы возвращают строки const), затем создайте новую строку, используя (например) initWithCString:encoding:. Помните, что в зависимости от того, что вы пытаетесь выполнить , смещение байтов может не дать ожидаемого результата из-за проблем с кодированием и многобайтовых символов.

Вы можете получить длину строки, используя length, который представляет собой количество символов в строке (также размер в unichars буфера для хранения данных UTF-16, а не включая нулевой терминатор), или lengthOfBytesUsingEncoding:, который сообщит вам размер (количество байтов), необходимый для буфера для хранения содержимого строки (не включая нулевой терминатор). maximumLengthOfBytesUsingEncoding: также может использоваться для размера буфера, хотя он может быть больше, чем фактический необходимый размер. Для кодировок переменной длины максимальный размер - это максимально возможный размер символов (например, 3 для кодированных в UTF-8 Unichars), умноженный на количество символов.

Циклы и смещения в остальном такие же, как в C: инициализируйте индексную переменную с нижней границей (0) и зацикливайте, пока индексная переменная не превысит верхнюю границу.

NSUInteger i;
NSString *result=nil;
unichar *data;
NSRange dataRange = {0,0};
dataRange.length = [string length];
if ((data = malloc(dataRange.length * sizeof(unichar)))) {
    [string getCharacters:data range:dataRange];
    for (i=0; i < dataRange.length; ++i) {
        // shiftAmount is declared elsewhere
        data[i] <<= shiftAmount;
    }
    result = [[NSString alloc] initWithCharacters:data length:dataRange.length];
} else {
    // malloc() failed; handle error
    ...
}

Если данные не строковые данные, а байты, то более подходящим будет NSData / NSMutableData.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...