将Swift字符串转换为CChar指针

将Swift字符串转换为CChar指针,c,swift,pointers,C,Swift,Pointers,在我的swift应用程序项目中,我必须与C API交互。其中一个C函数将字符指针作为输入,因此我必须将我的swift字符串转换为字符指针。但我不知道如何正确地做 以下是我的示例代码: var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100) var cusID = "123" user_id_ptr.memory = cusID.cStringUsingEncoding(NSUT

在我的swift应用程序项目中,我必须与C API交互。其中一个C函数将字符指针作为输入,因此我必须将我的swift字符串转换为字符指针。但我不知道如何正确地做

以下是我的示例代码:

var user_id_ptr : UnsafeMutablePointer<CChar> = UnsafeMutablePointer.alloc(100)
var cusID = "123"  
user_id_ptr.memory = cusID.cStringUsingEncoding(NSUTF8StringEncoding)!
var user\u id\u ptr:UnsafeMutablePointer=UnsafeMutablePointer.alloc(100)
var cusID=“123”
用户\u id\u ptr.memory=cusID.cStringUsingEncoding(NSUTF8StringEncoding)!
我总是犯这样的错误:
无法将“[CChar]”类型的值分配给“CChar”类型的值。

我还将答案签入:

上面的答案和我的略有不同。
上面的例子只针对一个字符,但我有一个字符串。另外,我必须向函数传递多个参数,我不能使用像let result=“N”这样的东西。请给我一些例子说明如何完成此操作。

如果C函数不改变作为参数传递的字符串, 然后参数应声明为
const char*
, 比如说

int func1(const char *s1, const char *s2);
在这种情况下,您只需传递自动转换的Swift字符串(比较):

如果函数参数声明为
char*

int func2(char *s1, char *s2);
然后必须使用
with cstring()
来获得临时表示 以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))
    }
}
注意,这仍然假设函数不会改变 传递字符串时,
UnsafeMutablePointer()
转换仅为
需要使编译器满意。

取决于C函数是采用
char*
还是
const char*
,或者两者都可以解决您的问题。谢谢您的回答,但我仍然遇到一些问题。示例u post仅用于一个字符,但我有一个字符串。另外,我必须向函数传递多个参数,我不能使用类似于
let result=“N”的东西。使用cstring{dgeev(UnsafeMutablePointer($0),UnsafeMutablePointer($0),&N,…)}
。请向我展示一些如何完成此操作的示例。相同的技术适用于(多个)字符串,但为了方便起见,我添加了它作为答案:)
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))
    }
}