抱歉,我什至不确定如何提问,因为我是 C 语言、指针之类的完全新手。有一个接受参数的函数:char **arg
。如果我这样写这个论点:
char *cargs[] = {"blah", NULL};
并将其传递给函数:
function(cargs);
它有效。但是……我有一个 NSStrings
的 NSArray
,我需要用 NSArray
的值创建这个数组。我认为应该创建一个与 NSArray
具有相同元素计数的 C 数组并复制字符串,使用 cStringUsingEncoding
转换它们。但老实说,我不知道该怎么做,因为我对所有这些指针等感到困惑。任何帮助将不胜感激。
最佳答案
嗯,粗略的步骤可以是:
使用 NSArray 的 count 方法可以知道 NSArray 中有多少个 NSString。
使用malloc为cargs分配内存,像这样
char **cargs = (char **) malloc(sizeof(char *) * count);
以您的示例为例,您可能需要在 cargs 的末尾为 NULL 多留一个空间。
使用循环和 NSArray 的 objectAtIndex: 来获取 NSStrings,例如 NSString *nsstring = [array objectAtIndex:index];
使用方法cStringUsingEncoding:获取c字符串,最好复制一份
将这些 c 字符串指针放入 cargs
将 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/