关于String和c strcpy的快速问题

时间:2015-01-22 09:02:19

标签: ios string swift cstring

我想在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字符串的表示  无法获得快速String的真正缓冲   还有另外一种方法吗?

1 个答案:

答案 0 :(得分:0)

在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函数必须使缓冲区以空值终止。要么它永远不需要修改最后一个字节(因此ptr.count - 1,就像你要调用strncpy),或者它需要添加空终止符本身(如snprintf),在这种情况下你可以传递完整的缓冲区大小。