所以我想知道,有没有一种快速的方法可以将一个由NSString填充的NSArray转换为等效的UTF8string值?
我想将一些参数配置存储在NSArray中,然后在以(int argv,const char * argv [])作为参数的函数中使用它们。
我以复杂的方式实现了这一点
int argc = [gameParameters count];
const char **argv = (const char **)malloc(sizeof(const char*)*argc);
for (int i = 0; i < argc; i++) {
argv[i] = (const char *)malloc(sizeof(char)*[[gameParameters objectAtIndex:i] length]+1);
strncpy((void *)argv[i], [[gameParameters objectAtIndex:i] UTF8String], [[gameParameters objectAtIndex:i] length]+1);
}
但是我真的不满意,清理内存很乏味。
您知道实现此结果的更好方法吗?
最佳答案
如果字符串包含非ASCII字符,则当前的实现不正确。例如,字符串@“é”(带ACUTE的小写字母E)的长度为1,而UTF-8序列“ C3 A9”的长度为2个字节。您的代码不会为该字符串分配足够的内存。
(换句话说:[string length]
返回字符串中的Unicode字符数,而不是UTF-8表示形式的字节数。)
根据Kevin Ballard的建议,使用strdup()
可以解决此问题:
argv[i] = strdup([[gameParameters objectAtIndex:i] UTF8String]);
但是,您还应该检查是否完全有必要复制字符串。如果在当前的自动发布上下文中调用该函数,则下面的内容就足够了:
int argc = [gameParameters count];
const char **argv = (const char **)malloc(sizeof(const char*)*argc);
for (int i = 0; i < argc; i++) {
argv[i] = [[gameParameters objectAtIndex:i] UTF8String];
}
yourFunction(argc, argv);
free(argv);