我有一个c函数,我从一个返回const char*
的桥接头访问:
const char* get_c_string();
然后我尝试将其转换为Swift String:
let str = String.fromCString(UnsafePointer<Int8>(get_c_string()))
print(str)
...但它只是打印垃圾:
Optional("\u{14}\0\0")
我可以找到如何将Swift字符串传递给C但不是相反。如何将const char*
转换为Swift字符串?
谢谢!
答案 0 :(得分:10)
你的Swift代码是正确的,你可以稍微缩短到
// Swift 2:
let str = String.fromCString(get_c_string())
// Swift 3:
let str = String(cString: get_c_string())
但是,您必须确保从C函数返回指针 函数返回时仍然有效。作为一个例子
const char* get_c_string() {
char s[] = "abc";
return s;
}
返回本地堆栈变量的地址,这是未定义的行为。
您可能需要复制字符串(然后考虑何时 以及释放记忆的地方。)