2015-10-08 104 views
2

我已經交流功能,這是我從一個橋接報訪問返回const char*從爲const char *轉換爲雨燕串

const char* get_c_string(); 

然後我嘗試將其轉換爲雨燕字符串:

let str = String.fromCString(UnsafePointer<Int8>(get_c_string())) 
print(str) 

...但它只是打印垃圾:

Optional("\u{14}\0\0") 

我可以找到如何斯威夫特字符串傳遞給C,但沒有反過來。如何將const char*轉換爲Swift字符串?

謝謝!

+0

這個字符串有特殊字符? –

+0

不,它只是一個標準的'const char *'c字符串(來自'std :: string') –

+0

你的例子中有兩個*不同的函數'get_c_string'和'call_hi'。除此之外,您的轉換方法應該可以工作。請注意,指針轉換不是必需的:'let str = String.fromCString(get_c_string())'。 –

回答

8

您的銀行代碼是正確的,你可以稍微縮短至

// 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; 
} 

返回本地堆棧變量的地址,這是未定義的行爲。

您可能需要複製字符串(然後再考慮何時 以及在哪裏釋放內存)。

+0

此API用法不再是最新的。編譯器報告:「請使用String.init?(validatingUTF8 :)。請注意,它不再接受NULL作爲有效輸入。還可以考慮使用String(cString :),它將嘗試修復不合格的代碼單元。 – sandover

+0

@sandover:上面的代碼仍然編譯沒有警告或錯誤與Xcode 7.3/Swift 2.2,這是當前的發行版本。 API似乎在Swift 3中發生了變化,所以我必須在正式發佈後更新答案。 –

+0

我希望這是我遇到的問題,但我不認爲它是。如果你有類似的見解,想聽聽你的想法:http://stackoverflow.com/questions/37776867/swift-string-from-c-string-has-correct-length-but-incorrect-contents – johnbakers