web-dev-qa-db-fra.com

Convertir NSString en tableau de caractères

J'ai une variable de type char[] et je veux y copier la valeur NSString. Comment puis-je convertir une NSString en tableau de caractères?

47
sagar

Utilisez -[NSString UTF8String] :

NSString *s = @"Some string";
const char *c = [s UTF8String];

Vous pouvez également utiliser -[NSString cStringUsingEncoding:] si votre chaîne est codée avec autre chose que UTF-8.


Une fois que vous avez le const char *, vous pouvez le manipuler de la même manière qu'un tableau de chars:

printf("%c\n", c[5]);

Si vous souhaitez modifier la chaîne, faites une copie:

char *cpy = calloc([s length]+1, 1);
strncpy(cpy, c, [s length]);
// Do stuff with cpy
free(cpy);
95
mipadi
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < [string length]; i++) {
    [array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
}
10
adjwilli

la réponse de mipadi est la meilleure si vous voulez juste un char* contenant le contenu de la chaîne, cependant NSString fournit des méthodes pour obtenir les données dans un tampon que vous avez alloué vous-même. Par exemple, vous pouvez copier les caractères dans un tableau de unichar en utilisant getCharacters:range: comme ceci:

NSUInteger length = [str length];
unichar buffer[length];

[str getCharacters:buffer range:NSMakeRange(0, length)];

for (NSUInteger i = 0; i < length; i++)
{
    doSomethingWithThis(buffer[i]);
}

Si vous devez utiliser char, vous pouvez utiliser le plus compliqué getBytes:maxLength:usedLength:encoding:options:range:remainingRange: comme ceci (démontré dans Arbre de Noël polonais de l'Est notation):

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];
9
dreamlax

Plutôt que getCharacters:range:, j'utilise:

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

Le résultat est un char [] (au lieu de unichar [] ), qui correspond à ce que souhaitait le PO et à ce que vous souhaitiez probablement utiliser pour la compatibilité C.

3
DefenestrationDay

Nous devons jouer à NSString en tant que tableau de caractères pour travailler sur des pratiques de codage qui sont autrement beaucoup plus simples à réaliser en codage en C simple. Utilisation de characterAtIndex: et appendFormat: m'aide. Peut-être que cela aidera.

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
Debaprio B

Dans Swift, un tableau de caractères est ponté en tant que UnsafePointer<Int8>. L'accès aux caractères fonctionne de la même manière dans Swift pour une NSString:

let str: NSString = "hello"
let charStr = str.UTF8String // UnsafePointer<Int8>

Pour un objet Swift String, les choses sont un peu différentes:

let str = "hello"
let charStr = str.cStringUsingEncoding(NSUTF8StringEncoding)

charStr est [CChar]?CChar est un typeailais pour Int8.

0
JAL