2012-01-22 49 views
1

我已经使用这个代码,以相反的顺序打印英语NSString打印以相反的顺序一个Unicode的NSString

 NSString *str = term; 
    NSMutableArray *temp=[[NSMutableArray alloc] init]; 
    for(int i=0;i<[str length];i++) 
    { 
     [temp addObject:[NSString stringWithFormat:@"%c",[str characterAtIndex:i]]]; 
    } 
    temp = [NSMutableArray arrayWithArray:[[temp reverseObjectEnumerator] allObjects]]; 
    NSString *[email protected]""; 
    for(int i=0;i<[temp count];i++) 
    { 
     reverseString=[NSString stringWithFormat:@"%@%@",reverseString,[temp objectAtIndex:i]]; 
    } 
    NSLog(@"%@",reverseString); 

但是这个代码仅适用于英文单词,所以当我尝试使用阿拉伯语单词像这个:控制台会显示随机的英文字符。

如何使用此代码打印上述单词(以及任何其他类似阿拉伯语(unicode)字符串)的反转版本?

回答

3

在第一次调用stringWithFormat时,您需要使用%C(大写字母C)而不是%c(小写字母c)格式说明符。小写'c'格式说明符用于8位字符;大写字母'C'代表unicode。

编辑:如果你想更有效地做到这一点,将数据复制到unichar元素的数组,扭转阵列,并将结果反馈到另一个NSString。这可让您反转字符串中Length/2步骤:

NSString * s = @"تجريب"; 
unichar *cc = (unichar*)malloc(s.length+1); 
[s getCharacters:cc]; 
for (NSUInteger i=0 ; i < s.length/2 ; i++) { 
    // swap elements at i and s.length-i-1 
    unichar tmp = cc[i]; 
    cc[i] = cc[s.length-i-1]; 
    cc[s.length-i-1] = tmp; 
} 
s = [NSString stringWithCharacters:cc length:s.length]; 
free(cc); 
NSLog(@"%@", s); 
+0

感谢这么多的家伙 – JAHelia

3

你有两个for循环那里,这个代码是非常低效的。我会用substringWithRange:代替characterAtIndex:并通过串向后遍历直接追加到输出字符串:

- (NSString *) createReverseStringFromString:(NSString *)inputString { 
    if (inputString.length <= 0) 
     return inputString; 

    NSMutableString *mutableReverseString = [[NSMutableString alloc] initWithCapacity:inputString.length]; 
    for (NSInteger i = inputString.length -1; i >= 0; i--) { 
     NSString *characterString = [inputString substringWithRange:NSMakeRange(i, 1)]; 
     [mutableReverseString appendString:characterString]; 
    } 

    NSString *outputString = [mutableReverseString copy]; 
    [mutableReverseString release]; 
    return [outputString autorelease]; 
} 

然后,您可以使用此方法是这样的:的

NSString *inputString = @"تجريب"; 
NSString *outputString = [self createReverseStringFromString:inputString]; 
+0

感谢您对本非常有效率的代码 – JAHelia

2

可可方式这样做:

NSString *originalString = @"تجريب"; 

NSUInteger stringLength = originalString.length; 

NSMutableString *reversedString = [[NSMutableString alloc] initWithCapacity:stringLength]; 

while (stringLength) { 
    [reversedString appendFormat:@"%C", [originalString characterAtIndex:--stringLength]]; 
} 

NSLog(@"The reversed string is %@:", reversedString); 

而且这将工作,没有泄漏reversedString编译与ARC。

+0

真棒Abizern ...万分感谢兄弟... – JAHelia