我在 Objective-C(Xcode)中获得了以下 char数组:
char *incomeMessage;
NSString *str = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];
incomeMessage = [str UTF8String];
NSLog(@"%c", incomeMessage[0]);
NSLog(@"%c", incomeMessage[1]);
NSLog(@"%c", incomeMessage[2]);
NSLog(@"%c", incomeMessage[3]);
NSLog(@"%c", incomeMessage[4]);
NSLog(@"%c", incomeMessage[5]);
例如,我在控制台中得到了一些这样的结果:
"3
2
6
1
8
4"
现在我想将incomeMessage [2]中的char替换为4:
incomeMessage[2] = '4';
然后它给了我错误: EXC_BAD_ACCESS
您有什么想法,如何解决问题?
答案 0 :(得分:3)
根据reference documentation,UTF8String
返回对字符串数据的只读(const char*
)引用。
参考资料继续注意:
此C字符串是指向字符串对象内部结构的指针, 它的寿命可能比字符串对象短,并且会 肯定没有更长的寿命。因此,您应该复制C 如果需要将字符串存储在其中的内存上下文之外 你使用这个属性。
所以我建议按照他们的建议,创建一个数组副本,然后对其进行修改。
你可能会有更好的运气:
NSString* str = [[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];
char* incomeMessage = malloc([str lengthOfBytesUsingEncoding:NSUTF8StringEncoding] + 1);
strcpy(incomeMessage, [str UTF8String]);
//now you can change things
incomeMessage[2] = '4';
//do this when you're done
free(incomeMessage);
尽管有什么特别的理由要使用C字符串/字符数组而不是NSMutableString
吗?我认为你可能会发现replaceCharactersInRange:withString:更好的做法。另见:stringByReplacingCharactersInRange:withString:。
答案 1 :(得分:2)
我在Objective-C(Xcode)中得到了以下字符数组
你不知道,你知道。你所拥有的只是一个指针。你没有留下任何实际的记忆;那里没有阵列。
incomeMessage = [str UTF8String];
您在该行中所做的一切就是在您的字符串incomeMessage
处重新指向指针UTF8String
。字符串UTF8String
是不可变的。请注意文档中的这段话:
如果需要将C字符串存储在使用此属性的内存上下文之外,则应复制该字符串。
所以基本上,如果你想写入char
数组,你的第一个任务应该是 make 一个char
的数组。