从const char *转换为Swift字符串

时间:2015-10-08 14:20:51

标签: c swift

我有一个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字符串?

谢谢!

1 个答案:

答案 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;
}

返回本地堆栈变量的地址,这是未定义的行为。

您可能需要复制字符串(然后考虑何时 以及释放记忆的地方。)