У меня есть переменная типа char[]
, и я хочу скопировать в нее значение NSString
. Как преобразовать массив NSString
в массив char?
Преобразование NSString в массив char
Ответ 1
Используйте -[NSString UTF8String]
:
NSString *s = @"Some string";
const char *c = [s UTF8String];
Вы также можете использовать -[NSString cStringUsingEncoding:]
, если ваша строка закодирована чем-то иным, чем UTF-8.
Как только у вас есть 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);
Ответ 2
Ответ mipadi является лучшим, если вы просто хотите, чтобы char*
содержал содержимое строки, однако NSString предоставляет методы для получения данных в буфер, который вы сами выделили. Например, вы можете скопировать символы в массив unichar
с помощью getCharacters:range:
следующим образом:
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:
, как это показано (показано в Восточная польская елка обозначение):
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
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < [string length]; i++) {
[array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
}
Ответ 4
Вместо getCharacters:range:
, я использую:
[stringToCopy getCString:c_buffer maxLength:c_buffer_length encoding:NSUTF8StringEncoding];
В результате получается char [] (вместо unichar []), чего хочет OP, и то, что вы, вероятно, хотите использовать для C.
Ответ 5
Нам нужно сыграть 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);
Ответ 6
В Swift массив char соединяется как UnsafePointer<Int8>
. Доступ к символам работает одинаково в Swift для NSString
:
let str: NSString = "hello"
let charStr = str.UTF8String // UnsafePointer<Int8>
Для объекта Swift String
все немного отличается:
let str = "hello"
let charStr = str.cStringUsingEncoding(NSUTF8StringEncoding)
charStr
[CChar]?
, где CChar
- это typeailais для Int8
.