当前位置: 首页 > 面试题库 >

如何将Swift字符串数组传递给带有char **参数的C函数

祁绪
2023-03-14
问题内容

我正在尝试与Swift的旧C终端应用程序进行交互。我已经成功集成了源代码,并将标头从C桥接到Swift。该代码从Xcode 6.3
beta编译并运行。我已将终端应用程序的主要入口点重命名为:

int initialize(int argc, char **argv);

不过,我正在努力将Swift的参数传递给此C函数。我的挑战是将参数转换为正确的格式。Swift的典型输入如下所示:

let args = ["-c", "1.2.3.4", "-p", "8000"]

我试过弄乱“ cStringUsingEncoding(NSUTF8StringEncoding)”和“
withUnsafePointer”,但到目前为止还没有运气。任何帮助是极大的赞赏!


问题答案:

C函数

int initialize(int argc, char **argv);

被映射为Swift

func initialize(argc: Int32, argv: UnsafeMutablePointer<UnsafeMutablePointer<Int8>>) -> Int32

这是一个可能的解决方案

let args = ["-c", "1.2.3.4", "-p", "8000"]

// Create [UnsafeMutablePointer<Int8>]:
var cargs = args.map { strdup($0) }
// Call C function:
let result = initialize(Int32(args.count), &cargs)
// Free the duplicated strings:
for ptr in cargs { free(ptr) }

它使用这样的事实:在strdup($0) Swift字符串中$0会自动将其转换为C字符串,如UnsafePointer
<UInt8>函数参数行为的字符串值中所述



 类似资料:
  • 问题内容: 我想将字符串数组作为参数传递给函数。请看下面的代码 代替: 但是如果我这样做,我会收到一条错误消息,指出将其转换为。我想知道是否可以传递这样的值,或者正确的方法是什么? 问题答案: 怎么样:

  • 问题内容: 以下代码的输出是因为从beginIndex到EndIndex-1。但是,令我惊讶的是这里的3(int)因为是两个整数。这背后的概念是什么? 问题答案: 一直到C,从本质上讲是一个窄整数类型,并在需要时隐式转换为C。 在Java中,这在技术上称为“扩展原始转换”,在JLS的5.1.2节中进行了介绍。

  • 我有以下代码: 我正在尝试将char和char指针数组传递给函数,但上面的代码会导致以下错误和警告: 我正在努力理解问题是什么。

  • 如何在不使其成为单独变量的情况下传递数组?例如,我知道这是有效的: 但我不想让数组成为变量,因为它只在这里使用。有没有办法做到这一点:

  • 在Swift编程语言中,它说: 函数也可以接受可变数目的参数,将它们收集到数组中。 当我用逗号分隔的数字列表(`sumof(1,2,3,4)调用这样一个函数时,它们在函数中作为一个数组可用。 问题:如果我已经有一个数组要传递给这个函数,该怎么办? 这将失败,并出现编译器错误,“无法找到接受所提供参数的'__conversion'的重载”。有没有办法把一个现有的数组变成一个我可以传递给一个变量函数的

  • 问题 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode。 解决方案 这里我们需要考虑很多的问题,但是最主要的问题是现存的C函数库并不理解Python的原生Unicode表示。 因此,你的挑战是将Python字符串转换为一个能被C理解的形式。 为了演示的目的,下面有两个C函数,用来操作字符串数据并输出它来调试和测试。 一个使用形式为 c