将Swift字符串转换为CChar指针
在我的swift应用程序项目中,我必须与C API交互。其中一个C函数将字符指针作为输入,因此我必须将我的swift字符串转换为字符指针。但我不知道如何正确地做 以下是我的示例代码:将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
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))
}
}