c - objective-c nsarray 到 c 数组

标签 c cocoa nsarray

抱歉,我什至不确定如何提问,因为我是 C 语言、指针之类的完全新手。有一个接受参数的函数:char **arg。如果我这样写这个论点:

char *cargs[] = {"blah", NULL};

并将其传递给函数:

function(cargs);

它有效。但是……我有一个 NSStringsNSArray,我需要用 NSArray 的值创建这个数组。我认为应该创建一个与 NSArray 具有相同元素计数的 C 数组并复制字符串,使用 cStringUsingEncoding 转换它们。但老实说,我不知道该怎么做,因为我对所有这些指针等感到困惑。任何帮助将不胜感激。

最佳答案

嗯,粗略的步骤可以是:

  1. 使用 NSArray 的 count 方法可以知道 NSArray 中有多少个 NSString。

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

    char **cargs = (char **) malloc(sizeof(char *) * count);
    

    以您的示例为例,您可能需要在 cargs 的末尾为 NULL 多留一个空间。

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

  4. 使用方法cStringUsingEncoding:获取c字符串,最好复制一份

  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;
}

关于c - objective-c nsarray 到 c 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3091251/

相关文章:

c++ - 当列表/数组中的元素数量可变时,哪种结构最适合实现?

c - 使用switch语句是否可以得到 'and'操作

c - C mingw 中的变量声明

macos - 如何让 NSWindow 看起来被禁用并且不响应用户输入?

objective-c - 打乱 N 个数字的数组并转换回整数

c - 如何使用 IP 地址形成 GET HTTP 请求

swift - 测试一个函数不会抛出错误

iphone - 如何使用比较:options对NSArray进行排序

iphone - 值的 NSArray,要按字母顺序显示在部分中。如何分配到正确的部分?

ios - 从数组中删除重复的项目并保留最后出现的项目 - iOS