1

UTF8string メソッドを介して NSString から変換した後、ac 文字列から文字を置き換えることは可能ですか?

たとえば、以下のコードを見てください。特定のルールで文字列をフォーマットすることです。

- (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] には「#」があり、入力の文字に置き換えられる必要があります。これは起こっていません。

4

2 に答える 2

1

いくつかの問題:

  1. をキャストしています。これは、をUTF8String返します。定義により、読み取り専用の文字列を返すため、そのように使用する必要があります。(キャストを使用する場合は、控えめに使用する必要があります。変数の修飾子をオーバーライドするためにキャストを使用しないでください。)const char *char *UTF8Stringconst

    この C 文字列操作を実行する場合は、文字列を独自のバッファーにコピーする必要があります。たとえば、getCStringorgetCharactersメソッドを使用します (ただし、それらを受け取るためのバッファーを作成し、NULLターミネーターの文字を追加することを忘れないでください)。

  2. ちなみに、(8 ビットよりも大きい可能性がある) である も返しcharacterAtIndex、それをバッファーで使用しています (1 文字あたり 8 ビット)。あまり注意せずにそれらを混ぜ合わせたり合わせたりすることには注意が必要です。1 つを選んでそれを使い続けるのが最善です (そして、8 ビット以外の文字に対してもう少し許容度を提供します)。unicharchar *unichar

  3. おそらく、以前にこれを確認していましたが、stringの後の文字に設定してから、次の文字数のprefix確認に進みました。rule.lengthしかし、私が知る限り、string実際に多くの文字が残っているという保証はありません. それをテストする必要があります。そうしないと、問題が発生します。

個人的には、この C 文字列アルゴリズム全体を廃止し、適切なNSStringand/orNSMutableStringメソッドを使用して必要な置換を行います。たとえばstringByReplacingCharactersInRangestringByReplacingOccurrencesOfString、または同等のNSMutableStringメソッド、replaceCharactersInRangeまたはreplaceOccurrencesOfString.

于 2013-10-22T06:52:24.810 に答える