2010-08-27 7 views

Répondre

88

Utilisation -[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 la const char *, vous pouvez travailler avec elle de façon similaire à un tableau de chars:

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

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

char *cpy = calloc([s length]+1, 1); 
strncpy(cpy, c, [s length]); 
// Do stuff with cpy 
free(cpy); 
+4

Il a demandé un tableau de char c'est un const char – JonasG

+1

@Maxner: Il est un pointeur * * à une chaîne de caractères const. – mipadi

+0

Je cherche une réponse complète qui montre le code de 'NSString * someString' à' char myArray [] = .. '.J'ai vraiment besoin de cela, pourriez-vous s'il vous plaît mettre à jour votre réponse? acclamations – JonasG

9

La réponse de mipadi est la meilleure si vous voulez juste un char* contenant le contenu de la chaîne, mais NSString fournit des méthodes pour obtenir les données dans un tampon à vous vous êtes attribué. 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 getBytes:maxLength:usedLength:encoding:options:range:remainingRange: plus compliqué comme ça (démontré dans Eastern Polish Christmas Tree 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]; 
3

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 []), ce qui est ce que l'OP voulait, et ce que vous voulez probablement utiliser pour la compatibilité C.

9
NSMutableArray *array = [NSMutableArray array]; 
for (int i = 0; i < [string length]; i++) { 
    [array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]]; 
} 
0

Dans Swift, un tableau char est ponté comme UnsafePointer<Int8>. Accès aux caractères fonctionne de la même manière Swift pour une NSString:

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

Pour une des choses objet Swift String sont un peu différentes:

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

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

0

Nous avons besoin de jouer à NSString en tant que tableau de caractères pour travailler sur des pratiques de codage, ce qui est autrement beaucoup plus simple à faire en codage C simple. En utilisant characterAtIndex: et appendFormat: m'aide. Peut être 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); 
+1

quel est le diff entre votre réponse et .... NSMutableString * strResult = [NSMutableString stringWithString: str]; ? – greenhouse