2010-08-27 20 views

risposta

88

Uso -[NSString UTF8String]:

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

Si potrebbe anche usare -[NSString cStringUsingEncoding:] se la stringa è codificato con qualcosa di diverso da UTF-8.


Una volta ottenuto il const char *, si può lavorare con esso in modo simile a una serie di chars:

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

Se si vuole modificare la stringa, fare una copia:

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

chiese un array di caratteri questo è un const char – JonasG

+1

@Maxner: E 'un puntatore * * in una stringa di caratteri const. – mipadi

+0

Sto cercando una risposta completa che mostri il codice da 'NSString * someString' a' char myArray [] = .. '.Ho davvero bisogno di questo, potresti aggiornare la tua risposta? evviva – JonasG

9

La risposta di mipadi è la migliore se si desidera semplicemente un char* contenente il contenuto della stringa, tuttavia NSString fornisce metodi per ottenere i dati in un buffer a te ti sei assegnato. Ad esempio, è possibile copiare i caratteri in un array di unichar usando getCharacters:range: come questo:

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

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

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

Se si deve usare char, quindi è possibile utilizzare il più complicato getBytes:maxLength:usedLength:encoding:options:range:remainingRange: come questo (dimostrato in Eastern Polish Christmas Tree notazione):

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

Piuttosto che getCharacters:range:, io uso:

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

Il risultato è uno char [] (anziché unichar []), che è ciò che l'OP desiderava e ciò che probabilmente si desidera utilizzare per la compatibilità con C.

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

In Swift, un array di char è colmato come UnsafePointer<Int8>. Accesso caratteri funziona allo stesso modo in Swift per un NSString:

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

Per una rapida String cose oggetto sono un po 'diverso:

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

charStr è [CChar]? dove CChar è un typeailais per Int8.

0

Abbiamo bisogno di riprodurre NSString come array di caratteri per lavorare su pratiche di codifica che è altrimenti molto più semplice da fare nella codifica C semplice. Utilizzo di characterAtIndex: e appendFormat: mi aiuta. Potrebbe essere questo aiuterà.

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

qual è il differenziale tra la risposta e .... NSMutableString * strResult = [NSMutableString stringWithString: str]; ? – greenhouse