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?
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);
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < [string length]; i++) {
[array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
}
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];
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.
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);
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]?
où CChar
est un typeailais pour Int8
.