从Swift字符串转换为const char*

7
我正在尝试将一个Swift字符串转换为旧的C库中的const char *。

我正在调用以下C函数:

artnet_node artnet_new(const char *ip, int verbose) { ...

如何将 Swift 字符串转换为 const char 类型?当我像这样传递 ipAddress 时它可以工作:
internal var ipAddress = "192.168.1.43"

但是当我像这样传递它时,它不起作用。
internal var ipAddress:String = "192.168.1.43"

我需要将这个放在一个函数里,并且需要指定类型:
internal func setupArtnode(ip:String) -> Int{

我尝试使用AnyObject而不是String,但那也不起作用。

谢谢。


请说明哪些部分无法正常工作——编译还是执行,以及任何相关的错误信息。 - sbooth
4个回答

11
你应该可以直接将一个 String 传递给一个期望 const char * 的 C 函数,它会自动转换为以空字符结尾的 UTF-8 字符串:
let string = "string"
let node = artnet_new(string, 1)

请参阅与C API交互获取更多信息。以下是相关摘录:

当一个函数被声明为接受UnsafePointer参数时,它可以接受以下任何一项:

  • 一个字符串值,如果类型为Int8或UInt8。字符串将自动转换为UTF8格式存储在缓冲区中,并将该缓冲区的指针传递给函数。

由于某些原因,该函数无法接受参数并采用默认值。我已经更新了问题并提供了更多信息。 - Steven B.
你的引用让我使用了UnsafePointer<Int8>,似乎很有效,我添加了我的工作代码。谢谢! - Steven B.

4

不确定为什么,但这段代码正常运行。它将一个字符串传递给一个接受const char*的C函数,这似乎与unsafePointer相同。

internal func setupArtnode(ipAddress:String) -> NSInteger{
    let cString = self.ipAddress.cString(using: String.defaultCStringEncoding)!
    let newString:String = NSString(bytes: cString, length: Int(ipAddress.characters.count), encoding:String.Encoding.ascii.rawValue)! as String
    let key2Pointer = UnsafePointer<Int8>(newString)

    node = artnet_new(key2Pointer, Int32(verbose))     // VERBOSE : true(1) , false(0)
...

2

Swift 3的简单方法

var ipAddress: String = "192.168.1.43"
var verbose: Int = 1
artnet_node artnet_new((ipAddress as NSString).utf8String, verbose)

在使用Swift时,如果直接传递字符串,使用sqlite3 API sqlite3_bind_text()时会出现内存损坏和奇怪的结果。(ipAddress as NSString).utf8String可以解决这个问题。 - vine'th

1

您没有指定您的Swift数组包含什么。无论如何,您需要将您的Swift数组转换为Int8类型的数组:

let str = "Hello world"
let cArray = str.cString(using: .utf8)

artnet_new(cArray, 1)

抱歉,我打错了,我想要将一个字符串更改为const char类型的:s,已编辑问题。 - Steven B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接