将Swift字符串转换为CChar指针

Wei*_*iao 4 c pointers swift

在我的swift app项目中,我必须与C API进行交互.其中一个C函数将char指针作为输入,因此我必须将我的swift字符串转换为char指针.但我不知道如何正确地做到这一点.

这是我的示例代码:

var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100)
var cusID = "123"  
user_id_ptr.memory = cusID.cStringUsingEncoding(NSUTF8StringEncoding)!
Run Code Online (Sandbox Code Playgroud)

我总是遇到这个错误: Cannot assign a value of type '[CChar]' to a value of type 'CChar'

我还检查了答案:Swift中的String中的UnsafeMutablePointer <Int8>

以上答案与我的略有不同.上面的例子只适用于一个字符,但我有一个字符串.另外,我必须向函数传递多个参数,我不能使用像let result ="N".withCString {dgeev_(UnsafeMutablePointer($ 0),UnsafeMutablePointer($ 0),&N,...)}之类的东西.请给我一些如何完成此操作的示例.

Mar*_*n R 10

如果C函数没有改变作为参数传递的字符串,那么参数应该被声明为const char *,例如

int func1(const char *s1, const char *s2);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以简单地传递自动转换的Swift字符串(将String值与UnsafePointer <UInt8>函数参数行为进行比较):

let str1 = "first string argument"
let str2 = "second string argument"

let result1 = func1(str1, str2)
Run Code Online (Sandbox Code Playgroud)

如果函数参数声明为 char *

int func2(char *s1, char *s2);
Run Code Online (Sandbox Code Playgroud)

那么你必须使用withCString()获取字符串的临时表示形式作为NUL终止的UTF-8字符数组:

let str1 = "first string argument"
let str2 = "second string argument"

// Swift 2:
let result2 = str1.withCString { s1 in
    str2.withCString { s2 in
        func2(UnsafeMutablePointer(s1), UnsafeMutablePointer(s2))
    }
}

// Swift 3:
let result2 = str1.withCString { s1 in
    str2.withCString { s2 in
        func2(UnsafeMutablePointer(mutating: s1), UnsafeMutablePointer(mutating: s2))
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这仍然假设函数不会改变传递的字符串,UnsafeMutablePointer()只需要转换就可以使编译器满意.