Convert NSString into char array

后端 未结 6 1611
别那么骄傲
别那么骄傲 2020-11-29 22:53

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条回答
  • 2020-11-29 23:16

    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);
    
    0 讨论(0)
  • 2020-11-29 23:24

    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);
    
    0 讨论(0)
  • 2020-11-29 23:29

    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];
    
    0 讨论(0)
  • 2020-11-29 23:37

    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.

    0 讨论(0)
  • 2020-11-29 23:39
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < [string length]; i++) {
        [array addObject:[NSString stringWithFormat:@"%C", [string characterAtIndex:i]]];
    }
    
    0 讨论(0)
  • 2020-11-29 23:39

    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.

    0 讨论(0)
提交回复
热议问题