gpt4 book ai didi

ios - 关于 String 和 c strcpy 的快速问题

转载 作者:行者123 更新时间:2023-11-28 09:15:06 24 4
gpt4 key购买 nike

我想在swift中调用一个c++函数

bool getId3Info(const char * filename , char *artist , char * title  )
{
// get the file's id3v2 tag, write info back
strcpy(artist,(const char*) id3v2tag->artist().toCString(true));
strcpy(title,id3v2tag->title().toCString(true));
}

所以我为这个函数写了一个 object-c 包装器:

-(bool) getId3Info:(const char * )filename :( const char *)artist :( const char *) title
{
return getId3Info(filename, (char*)artist, (char*)title);
}

所以问题是我只能使用 cStringUsingEncoding 获得 C 字符串的表示,
无法获取 swift String 的真实缓冲区,
还有其他方法吗?

最佳答案

在 Swift 中,你可以传递一个 const char*像这样的 C 函数:

func foo(s: String) { s.withCString({ p in cfunction(p) }) }

或者,更明确地说明类型:

func foo(s: String) { s.withCString({ (p:UnsafePointer<CChar>) in cfunction(p) }) }

(即 p 是 UnsafePointer<CChar> ,相当于 const char* )

如果你想从 C 函数初始化一个字符串,你需要一个更复杂的咒语,像这样:

var buf = Array<CChar>(count: 1000, repeatedValue: 0);
let result = buf.withUnsafeMutableBufferPointer({
(inout ptr: UnsafeMutableBufferPointer<CChar>) -> String? in
cfunction(ptr.baseAddress, ptr.count - 1)
String.fromCString(ptr.baseAddress)
})

请注意,C 函数必须使缓冲区以 null 结尾。它要么永远不需要修改最后一个字节(因此是 ptr.count - 1 ,就像您调用 strncpy 一样),要么它需要自己添加空终止符(例如 snprintf ),在这种情况下,您可以传入完整的缓冲区大小。

关于ios - 关于 String 和 c strcpy 的快速问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28084714/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com