我有一个 c 函数,我从一个返回 const char*
的桥接头访问它:
const char* get_c_string();
然后我尝试将它转换为 Swift 字符串:
let str = String.fromCString(UnsafePointer<Int8>(get_c_string()))
print(str)
...但它只是打印垃圾:
Optional("\u{14}\0\0")
我可以找到如何将 Swift 字符串传递给 C 而不是相反的方法。如何将 const char*
转换为 Swift 字符串?
谢谢!
最佳答案
您的 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;
}
返回局部堆栈变量的地址,这是未定义的行为。
你可能不得不复制字符串(然后想想什么时候 以及释放内存的位置)。
关于从 const char* 转换为 Swift 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33018494/