I have a variable of type char[]
and I want to copy NSString
value in it. How can I convert an NSString
to a char array?
We need to play NSString as a character array for working on coding practices which is otherwise much simpler to do in plain C coding. Using characterAtIndex: and appendFormat: helps me. May be this will help.
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);
Use -[NSString UTF8String]:
NSString *s = @"Some string";
const char *c = [s UTF8String];
You could also use -[NSString cStringUsingEncoding:] if your string is encoded with something other than UTF-8.
Once you have the const char *
, you can work with it similarly to an array of chars
:
printf("%c\n", c[5]);
If you want to modify the string, make a copy:
char *cpy = calloc([s length]+1, 1);
strncpy(cpy, c, [s length]);
// Do stuff with cpy
free(cpy);
mipadi's answer is the best if you just want a char*
containing the contents of the string, however NSString provides methods for obtaining the data into a buffer that you have allocated yourself. For example, you can copy the characters into an array of unichar
using getCharacters:range: like this:
NSUInteger length = [str length];
unichar buffer[length];
[str getCharacters:buffer range:NSMakeRange(0, length)];
for (NSUInteger i = 0; i < length; i++)
{
doSomethingWithThis(buffer[i]);
}
If you have to use char
, then you can use the more complicated getBytes:maxLength:usedLength:encoding:options:range:remainingRange: like this (demonstrated in 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];
Rather than getCharacters:range:
, I use:
[stringToCopy getCString:c_buffer maxLength:c_buffer_length encoding:NSUTF8StringEncoding];
The result is a char[] (instead of unichar[]), which is what the OP was wanting, and what you probably want to use for C compatibility.
NSMutableArray *array = [NSMutableArray array];
for (int i = 0; i < [string length]; i++) {
[array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
}
In Swift, a char array is bridged as an UnsafePointer<Int8>
. Accessing characters works the same way in Swift for an NSString
:
let str: NSString = "hello"
let charStr = str.UTF8String // UnsafePointer<Int8>
For a Swift String
object things are a little different:
let str = "hello"
let charStr = str.cStringUsingEncoding(NSUTF8StringEncoding)
charStr
is [CChar]?
where CChar
is a typeailais for Int8
.