objective-c nsarray to c array

Mar*_*ius 4 c cocoa nsarray

对不起,我甚至不确定怎么问,因为我是C的完全新手,指针和类似的东西.有一个接受参数的函数:char **arg.如果我这样写这个论点:

char *cargs[] = {"blah", NULL};
Run Code Online (Sandbox Code Playgroud)

并将其传递给函数:

function(cargs);
Run Code Online (Sandbox Code Playgroud)

有用.但是...我有一个NSArray,NSStrings我需要从数值中取出这个数组NSArray.我认为这应该是创建一个具有相同元素数量的C数组NSArray并复制字符串,将其转换为cStringUsingEncoding.但老实说,我不知道怎么做,因为我对所有这些指针都很困惑.任何帮助,将不胜感激.

yeh*_*nan 6

那么,粗略的步骤可以是:

  1. 使用NSArray的count方法来了解NSArray中有多少NSStrings.

  2. 使用malloc为cargs分配内存,就像这样

    char **cargs = (char **) malloc(sizeof(char *) * count);
    
    Run Code Online (Sandbox Code Playgroud)

    通过您的示例,您可能需要再多一个空间用于NULL,这将在cargs的末尾.

  3. 使用NSArray 的循环和objectAtIndex来获取NSStrings,如NSString*nsstring = [array objectAtIndex:index];

  4. 使用方法cStringUsingEncoding:获取c-string,更好地复制

  5. 把这些c字符串指针放在cargs中

  6. 将cargs传递给你的功能,清洁和免费提供所需的东西.

这是很多工作.'因为混合了c和obj-c的东西.还有很多手动的malloc和免费,凌乱的东西.你不能避免吗?

- 添加示例代码 -

我不太确定你的真实意图是什么.希望这会有所帮助.

void func(char **arg)
{
    int i;
    for(i = 0; arg[i] != NULL; i++) {
        printf("%d=%s\n", i, arg[i]);
}
}
int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSString *s1 = [NSString stringWithString:@"first"];
    NSString *s2 = [NSString stringWithString:@"second"];
    NSString *s3 = [NSString stringWithString:@"third"];

    NSArray *array = [NSArray arrayWithObjects: s1, s2, s3, nil];
    //by now, we have an NSArray of three NSStrings

    int count = [array count];
    char **cargs = (char **) malloc(sizeof(char *) * (count + 1));
    //cargs is a pointer to 4 pointers to char

    int i;
    for(i = 0; i < count; i++) {
        NSString *s = [array objectAtIndex:i];//get a NSString
        const char *cstr = [s cStringUsingEncoding:NSUTF8StringEncoding];//get cstring
        int len = strlen(cstr);//get its length
        char *cstr_copy = (char *) malloc(sizeof(char) * (len + 1));//allocate memory, + 1 for ending '\0'
        strcpy(cstr_copy, cstr);//make a copy
        cargs[i] = cstr_copy;//put the point in cargs
    }
    cargs[i] = NULL;

    func(cargs);//call the function to do something

    for(i = 0; i < count; i++) {
        free(cargs[i]);
    }
    free(cargs);

    [pool drain];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)