Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将一个填充NSString的NSArray转换为UTF8String向量_Objective C_C_Nsstring_Nsarray - Fatal编程技术网

Objective c 将一个填充NSString的NSArray转换为UTF8String向量

Objective c 将一个填充NSString的NSArray转换为UTF8String向量,objective-c,c,nsstring,nsarray,Objective C,C,Nsstring,Nsarray,所以我想知道,是否有一些快速的方法可以将一个NSArray中填充的NSString转换为等效的UTF8string值 我想在NSArray中存储一些参数配置,然后在一个以(int argv,const char*argv[])为参数的函数中使用它们 我以一种复杂的方式实现了这一点 int argc = [gameParameters count]; const char **argv = (const char **)malloc(sizeof(const char*)*argc); for (

所以我想知道,是否有一些快速的方法可以将一个NSArray中填充的NSString转换为等效的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);
}
int argc=[gameParameters count];
常量字符**argv=(常量字符**)malloc(sizeof(常量字符*)*argc);
对于(int i=0;i
但我并不真的很高兴,清理记忆是乏味的


您知道实现此结果的更好方法吗?

如果字符串包含非ASCII字符,则当前实现不正确。例如,字符串@“é”(带锐音符的小写字母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);
int argc=[gameParameters count];
常量字符**argv=(常量字符**)malloc(sizeof(常量字符*)*argc);
对于(int i=0;i
你可能会发现
strdup()
malloc
+
strncpy
简单得多(尽管你以后还需要清理)。是的,我在最后的代码中使用了strdup(),最后我使用了strdup,我只是希望系统库中已经有了一些可用的东西。谢谢