如何替换char数组中的char? Xcode中

时间:2015-01-13 04:33:14

标签: objective-c arrays char exc-bad-access

我在 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

您有什么想法,如何解决问题?

2 个答案:

答案 0 :(得分:3)

根据reference documentationUTF8String返回对字符串数据的只读(const char*)引用。

参考资料继续注意:

  

此C字符串是指向字符串对象内部结构的指针,   它的寿命可能比字符串对象短,并且会   肯定没有更长的寿命。因此,您应该复制C   如果需要将字符串存储在其中的内存上下文之外   你使用这个属性。

所以我建议按照他们的建议,创建一个数组副本,然后对其进行修改。

例如:http://ideone.com/mhjwZW

你可能会有更好的运气:

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的数组。