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

一句话,NO。那个缓冲区不属于你,所以别管它。

于 2013-10-22T05:42:41.990 回答
1

几个问题:

  1. 您正在转换UTF8String,它返回一个const char *, 到char *UTF8String是,根据定义,返回一个只读字符串,你应该这样使用它。(如果有的话,你真的应该谨慎使用转换。当然永远不要使用转换来覆盖const变量的限定符。)

    如果要执行此 C 字符串操作,则必须将字符串复制到自己的缓冲区。例如,使用getCStringgetCharacters方法(但只有在您创建了一个缓冲区来接收它们之后,并记住为NULL终止符添加一个字符)。

  2. 顺便说一句,您还返回characterAtIndex,它是 a unichar(可以大于 8 位),并在char *缓冲区中使用它(每个字符 8 位)。我会谨慎地混合和匹配那些而不非常小心。最好选择一个并坚持下去(并对unichar那些非 8 位字符提供更多的容忍度)。

  3. 也许您之前检查过这个,但是您设置string为 之后的那些字符prefix,然后继续检查下一个rule.length字符数。但是,据我所知,您无法保证其中string实际上还剩下那么多字符。您应该对此进行测试,否则也会导致问题。

就个人而言,我会放弃整个 C 字符串算法并使用适当的NSString和/或NSMutableString方法来做任何你想要的替换,例如stringByReplacingCharactersInRange,stringByReplacingOccurrencesOfString或等效NSMutableString方法,replaceCharactersInRangereplaceOccurrencesOfString.

于 2013-10-22T06:52:24.810 回答