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?
6 Answers
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);
5 Comments
NSString *someString to char myArray[] =... I really need this, could you please update your answer? cheerschar csignid[] = "something"; but with the somethingfrom an NSString. I need it to be able to modify the array like this csignid[5] = a+0x21;. Declaring the char array like this char csignid[] = [@"dunno" UTF8String]; or const char* csignid[] = [@"" UTF8String];returns an error message saying 'Array initializer must be an initializer list'. Thanksmipadi'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];
Comments
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);
1 Comment
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 typealias for Int8.