2013-10-22 23 views
1

在通過UTF8string方法將其從NSString轉換爲字符串後,是否可以替換字符?替換cstring中的字符 - 獲取錯誤

例如,拿下面的代碼。它是用特定的規則格式化一個字符串。

- (NSString *)formatString:(NSString *)input { 
    if (input.length==0) { 
     return @""; 
    } 
    //code to determine rule 
    .... 
    .... 
    // substitute output format with input characters 
    if (rule) { 
     input = [input substringFromIndex:prefix.length]; 
     char *string = (char *)[rule UTF8String]; 
     int repCount = 0; 
     for (int i=0; i<rule.length; i++) { 
      if (string[i] == '#') { 
       if (repCount < input.length) 
        string[i] = [input characterAtIndex:repCount++];//bad access 
       else 
        string[i] = ' '; 
      } 
     } 
     NSMutableString *output = [NSMutableString stringWithCString:string encoding:NSUTF8StringEncoding]; 
    ... 
    ... //do something with the output 
    return output; 
    } else { 
    return input; 
    } 
} 

最初string [0]具有'#',它應該被輸入中的字符替換。這沒有發生。

+0

您能否提供您使用的規則前綴和輸入示例? –

+0

我真的很抱歉,因爲我不能這樣做,它的私人:-) – thandasoru

回答

1

總之,那個緩衝區不屬於你,所以不要管它。

+0

有趣的是,我有這個代碼在早期版本的應用程序中工作,即使現在我經歷它!但它現在不工作: - D.順便說一下,我已經看到了你在其他線程中替換字符串的答案,所以我願意接受它。 – thandasoru

+1

@thandasoru這是未定義的行爲,因此可能隨時打破。我會提取字符串到一個緩衝區('unichar'對象),你可以使用相同的算法使用這個屬於你的緩衝區。 – trojanfoe

+0

我只是創建了一個字符緩衝區,使用for循環複製了字符,並使用新的緩衝區進行了替換,就像您上面所說的那樣,它的工作方式就像一個魅力! – thandasoru

1

幾個問題:

  1. 您是鑄造UTF8String,它返回一個const char *,以char *。根據定義,UTF8String是返回一個只讀字符串,您應該像這樣使用它。 (如果有的話,你真的應該謹慎使用強制轉換,當然從不使用強制轉換來替代變量的const限定符。)

    如果要執行此C字符串操作,必須將字符串複製到自己的緩衝區。例如,使用getCStringgetCharacters方法(但只有在創建緩衝區後才能接收它們,並記住爲NULL終止符添加一個字符)。

  2. 順便說一句,你還回來characterAtIndex,這是一個unichar(可以比8位大),並在char *緩衝使用它(每個字符8位)。我會小心謹慎地混合和匹配這些內容。最好選擇一個,並堅持下去(並且unichar爲這些非8位字符提供了更多的寬容)。

  3. 也許你檢查這個較早,但你設置stringprefix後這些字符,然後繼續檢查下rule.length的字符數。但是,據我所知,你不能保證string實際上已經留下了許多字符。你應該測試一下,否則這也會導致問題。

個人而言,我退休了這整個C-字符串變換算法,並採用適當的NSString和/或NSMutableString方法做你想要的任何更換,例如stringByReplacingCharactersInRange,stringByReplacingOccurrencesOfString或等效的NSMutableString方法,replaceCharactersInRangereplaceOccurrencesOfString