将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数

Posted

技术标签:

【中文标题】将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数【英文标题】:Converting NSStrings to C chars and calling a C function from Objective-C 【发布时间】:2016-05-18 14:02:41 【问题描述】:

我在一个带有各种 NSStrings 的 Objective-C 方法中,我想将它们传递给 C 函数。 C 函数要求 struct 对象为 malloc'd 以便可以传入 - 此结构包含 char 字段。所以struct 是这样定义的:

struct libannotate_baseManual 
    char *la_bm_code;  // The base code for this manual (pointer to malloc'd memory)
    char *la_bm_effectiveRevisionId; // The currently effective revision ID (pointer to malloc'd memory or null if none effective)
    char **la_bm_revisionId; // The null-terminated list of revision IDs in the library for this manual (pointer to malloc'd array of pointers to malloc'd memory)
;

这个结构然后用在下面的 C 函数定义中:

void libannotate_setManualLibrary(struct libannotate_baseManual **library)  ..

这就是我需要从 Objective-C 调用的函数。

所以我有各种NSStrings,我基本上想在其中传递,以表示字符 - la_bm_codela_bm_effectiveRevisionIdla_bm_revision。我可以使用[NSString UTF8String] 将它们转换为const chars,但我需要chars,而不是const chars。

我还需要为这些字段做合适的malloc,但显然我不需要担心之后释放内存。 C 不是我的强项,虽然我很了解 Objective-C。

【问题讨论】:

【参考方案1】:

strdup() 是您在这里的朋友,因为只需一个简单的步骤,malloc()s 和 strcpy()s 都会为您服务。它的内存也使用free() 释放,它会为您完成const char *char * 的转换!

NSString *code = ..., *effectiveRevId = ..., *revId = ...;
struct libannotate_baseManual *abm = malloc(sizeof(struct libannotate_baseManual));
abm->la_bm_code = strdup([code UTF8String]);
abm->la_bm_effectiveRevisionId = strdup([effectiveRevId UTF8String]);
const unsigned numRevIds = 1;
abm->la_bm_effectiveRevisionId = malloc(sizeof(char *) * (numRevIds + 1));
abm->la_bm_effectiveRevisionId[0] = strdup([revId UTF8String]);
abm->la_bm_effectiveRevisionId[1] = NULL;

const unsigned numAbms = 1;    
struct libannotate_baseManual **abms = malloc(sizeof(struct libannotate_baseManual *) * (numAbms + 1));
abms[0] = abm;
abms[1] = NULL;
libannotate_setManualLibrary(abms);

祝你好运,你会需要它的。这是我见过的最糟糕的界面之一。

【讨论】:

太棒了,谢谢。现在正在尝试。顺便说一句,是的 - 需要传入一个指针数组,所以也要看看。

以上是关于将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数的主要内容,如果未能解决你的问题,请参考以下文章

{__ob__: Observer}怎么拿值?

拆分并从字符串转换为字符数组

C程序调用字符串到int函数,我无法转换输入

如何将原始 NSData 以及一些 NSStrings 发布到我的服务器?

IOS/Objective-C:按字符串中的单词数对 NSStrings 的 NSArray 进行排序

将 php 转换为 c#,将 curl 转换为 .net [关闭]