替换cstring中的字符 - 获取错误的访问权限

时间:2013-10-22 05:38:49

标签: objective-c nsstring

通过UTF8string方法从NSString转换后,是否可以替换c字符串中的字符?

例如,请参考下面的代码。它是用特定规则格式化字符串。

- (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]有'#',它应该被输入中的字符替换。这种情况没有发生。

2 个答案:

答案 0 :(得分:1)

总之,没有。那个缓冲区不属于你,所以不管它。

答案 1 :(得分:1)

有几个问题:

  1. 您正在向UTF8String投射const char *,其返回char *。根据定义,UTF8String返回一个只读字符串,您应该这样使用它。 (你真的应该谨慎使用强制转换,如果有的话。当然绝不会使用强制转换覆盖变量的const限定符。)

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

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

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

  4. 就个人而言,我将退出整个C字符串算法,并使用适当的NSString和/或NSMutableString方法进行您想要的任何替换,例如: stringByReplacingCharactersInRangestringByReplacingOccurrencesOfString或等效NSMutableString方法,replaceCharactersInRangereplaceOccurrencesOfString