通过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]有'#',它应该被输入中的字符替换。这种情况没有发生。
答案 0 :(得分:1)
总之,没有。那个缓冲区不属于你,所以不管它。
答案 1 :(得分:1)
有几个问题:
您正在向UTF8String
投射const char *
,其返回char *
。根据定义,UTF8String
返回一个只读字符串,您应该这样使用它。 (你真的应该谨慎使用强制转换,如果有的话。当然绝不会使用强制转换覆盖变量的const
限定符。)
如果要执行此C字符串操作,则必须将字符串复制到自己的缓冲区。例如,使用getCString
或getCharacters
方法(但只有在您创建了一个缓冲区来接收它们之后,并且记得为NULL
终结符添加一个字符。)
顺便说一句,您还要返回characterAtIndex
,unichar
(可能大于8位),并在char *
中使用它缓冲区(每个字符8位)。我很谨慎混合和匹配那些而不是非常小心。最好选择一个并坚持下去(unichar
为那些非8位字符提供更多的容忍度。)
也许您之前检查过这个问题,但是您要将string
设置为prefix
之后的那些字符,然后继续检查下一个rule.length
个字符数。但是,据我所知,你无法保证string
实际上还有很多字符。你应该测试一下,否则也会导致问题。
就个人而言,我将退出整个C字符串算法,并使用适当的NSString
和/或NSMutableString
方法进行您想要的任何替换,例如: stringByReplacingCharactersInRange
,stringByReplacingOccurrencesOfString
或等效NSMutableString
方法,replaceCharactersInRange
或replaceOccurrencesOfString
。