2012-06-19 37 views
2

我在學習Objective C和iOS開發。我試圖重新創建我們在Java類中完成的一些項目(我知道它們完全不同),但是我在其中一個項目中遇到了麻煩。我們在一天的實驗室裏正在做凱撒換班。一個字符串操作實驗室這在Java中是一個非常基本的交易......通過字符串進行for循環並更改每個字符。我似乎無法找到任何方式改變單個字符的目的C.我已經通過了的NSMutableString文檔和文件NSString的看着,我知道我可以做一個凱撒移位加密對象C

[NSString stringByReplacingCharactersInRange:(NSRange *) withString:(NSString *)

,但並沒有真正幫助,因爲我不知道我將被替換。我需要找到一種方法來抓住特定索引處的字符並對其進行更改。有任何想法嗎?

回答

2

聽起來像是你正在尋找的[NSString characterAtIndex:(NSUInteger)]方法

例如

NSString *string = @"abcde"; 
NSString *character = [NSString stringWithFormat:@"%C",[string characterAtIndex: 0]]; 
NSLog(@"%@", character); 

結果:一個

利用這一點,和NSMutableString,你可以建立你需要的字符串。

尤斯appendString您可以添加到一個NSMutableString

+0

'-characterAtIndex:'返回一個'unichar',而不是'NSString'。 -1直到修復。 –

+0

固定爲解決unichar。 – danielbeard

+0

我發誓我看了看,並沒有看到有關characterAtIndex的任何信息!這是我將用於Java'string.chatAt();'這是令人沮喪的。儘管謝謝你的回答。 – CaldwellYSR

1

也許是最好的方式結束,這將使用一個很好的舊C-串做,因爲這可以讓你改變字節沒有重新分配的開銷不同的字符串每次:

NSString *ceasarShift(NSString *input) 
{ 
    char *UTF8Str = strdup([input UTF8String]); 

    int length = [input length]; 
    for (int i = 0; i < length; i++) 
    { 
     UTF8Str[i] = changeValueOf(UTF8Str[i]); // some code here to change the value 
    } 

    NSString *result = [NSString stringWithUTF8String:UTF8Str]; 
    free(UTF8Str); 

    return result; 
} 

這將減少開銷,但你必須釋放,當你完成你分配的數據,它爲您提供了不依賴於高層次的API,極大地提高了性能的優勢。 (陣列集和動態查找方法之間的區別是~5個CPU週期,這意味着很多如果您正在進行任何主要類型的加密)

也許還會考慮NSMutableData這類任務,而不是NSString ,因爲隨機的\0可能每個機會出現在結果字符串中。

+0

如果輸入包含需要多個字節以UTF8表示的任何內容,則這是個問題 - 逐字節解析UTF8字符串,因爲普通的C字符串只能以淚結束。 –

+0

我很欣賞答案,我相信你的答案是正確的......但我對常規C唯一知道的事實是,你可以定義一個函數。本週我開始使用Objective-C。也許有一天這個答案對我來說會更好,但現在這有點危險;) – CaldwellYSR