Конвертировать NSString в массив символов - PullRequest
47 голосов
/ 27 августа 2010

У меня есть переменная типа char[], и я хочу скопировать в нее значение NSString.Как я могу преобразовать NSString в массив символов?

Ответы [ 6 ]

97 голосов
/ 27 августа 2010

Используйте -[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);
10 голосов
/ 21 декабря 2012
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < [string length]; i++) {
    [array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
}
9 голосов
/ 27 августа 2010

Ответ 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 голосов
/ 28 января 2011

Вместо getCharacters:range: я использую:

[stringToCopy getCString:c_buffer maxLength:c_buffer_length encoding:NSUTF8StringEncoding];

В результате получается char [] (вместо unichar [] ), чточто хотел ОП и что вы, вероятно, хотите использовать для совместимости с Си.

0 голосов
/ 19 марта 2017

Нам нужно играть 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);
0 голосов
/ 18 марта 2016

В Swift массив символов соединяется как 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 is [CChar]?, где CChar является типом для Int8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...