2012-01-22 47 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