我有一个char[]
类型的变量,我想在其中复制NSString
值。如何将NSString
转换为char数组?
答案 0 :(得分:96)
NSString *s = @"Some string";
const char *c = [s UTF8String];
如果您的字符串使用UTF-8以外的其他字符串编码,您也可以使用-[NSString cStringUsingEncoding:]
。
获得const char *
之后,您可以使用chars
数组来处理它:
printf("%c\n", c[5]);
如果要修改字符串,请复制:
char *cpy = calloc([s length]+1, 1);
strncpy(cpy, c, [s length]);
// Do stuff with cpy
free(cpy);
答案 1 :(得分:10)
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < [string length]; i++) {
[array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
}
答案 2 :(得分:9)
char*
,那么mipadi的答案是最好的,但NSString提供了将数据获取到你自己分配的缓冲区的方法。例如,您可以使用getCharacters:range:
将字符复制到unichar
数组中,如下所示:
NSUInteger length = [str length];
unichar buffer[length];
[str getCharacters:buffer range:NSMakeRange(0, length)];
for (NSUInteger i = 0; i < length; i++)
{
doSomethingWithThis(buffer[i]);
}
如果您必须使用char
,那么您可以使用更复杂的getBytes:maxLength:usedLength:encoding:options:range:remainingRange:
(如Eastern Polish Christmas Tree表示法中所示):
NSUInteger length = [str length];
NSUInteger bufferSize = 500;
char buffer[bufferSize] = {0};
[str getBytes:buffer
maxLength:(bufferSize - 1)
usedLength:NULL
encoding:NSUTF8StringEncoding
options:0
range:NSMakeRange(0, length)
remainingRange:NULL];
答案 3 :(得分:3)
而不是getCharacters:range:
,我使用:
[stringToCopy getCString:c_buffer maxLength:c_buffer_length encoding:NSUTF8StringEncoding];
结果是 char [] (而不是 unichar [] ),这是OP想要的,以及您可能想要用于C兼容性的内容
答案 4 :(得分:0)
在Swift中,char数组被桥接为UnsafePointer<Int8>
。对于NSString
:
let str: NSString = "hello"
let charStr = str.UTF8String // UnsafePointer<Int8>
对于Swift String
对象,情况略有不同:
let str = "hello"
let charStr = str.cStringUsingEncoding(NSUTF8StringEncoding)
charStr
为[CChar]?
,其中CChar
是Int8
的类型。
答案 5 :(得分:0)
我们需要将NSString作为一个字符数组来处理编码实践,否则在简单C编码中要简单得多。使用 characterAtIndex:和 appendFormat:可以帮助我。可能会有所帮助。
NSString *str = @"abcdef";
NSMutableString *strResult = [NSMutableString string];
for (NSUInteger i = 0; i < [str length]; i++) {
char ch = [str characterAtIndex:i];
[strResult appendFormat:@"%c", ch];
}
NSLog(@"%@", strResult);