objective-c中的两个简单字符串操作(移位操作和迭代)

时间:2011-10-23 08:54:18

标签: objective-c nsstring

我想在obj-c中操作NSString这是我想做的事情:

通过for-each / for循环迭代字符串并向左移位(<<)NSString的每个字符 但我不知道如何迭代NSString的字符以及如何在obj-c中使用shift运算符。

我在objective-c中相当新。

问候

2 个答案:

答案 0 :(得分:2)

代码:

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 :(得分:1)

NSString是不可变的; mutableCopyWithZone:会给你一个(implicitly retainedNSMutableString。但是,NSMutableString无法设置单个字符。使用众多方法之一获取一组字符会更容易(例如getCharacters:range:表示宽字符,或cStringUsingEncoding:getCString:maxLength:encoding:UTF8String表示c样式字符串),然后操作(注意一些方法返回const字符串),然后使用(例如)initWithCString:encoding:构造一个新的字符串。请记住,根据您的trying to accomplish,由于编码问题和多字节字符,移位字节可能无法提供您期望的结果。

你可以使用length来获取字符串的长度,这是字符串中的字符数(也就是用于保存UTF-16数据的缓冲区的大小,也就是unichars,不包括null-终结符)或lengthOfBytesUsingEncoding:,它将告诉您缓冲区保存字符串内容所需的大小(字节数)(不包括空终止符)。 maximumLengthOfBytesUsingEncoding:也可用于缓冲区大小,但可能大于实际所需大小。对于可变长度编码,最大大小是可能的最大字符大小(例如,对于UTF-8编码的unichars为3)乘以字符数。

循环和移位与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会更合适。