【发布时间】:2013-03-24 12:22:55
【问题描述】:
我在尝试从 const char * 获取 NSString 时遇到了一个奇怪的错误。
// in my obj c class
void myObjCMethod {
const char* charString = myCFunctionReturningConstCharPtr();
printf("%s \n", charString); // prints the correct string
// ...put a brakpoint here...
NSString * nsString1 = [NSString stringWithUTF8String:charString];
NSLog(@"%@", nsString1); // prints nothing
NSString * nsString2 = [NSString stringWithFormat:@"%s",charString];
NSLog(@"%@", nsString2); // prints nothing either
}
来自我的 c 方法的 const char 可以很好地打印到控制台。但是尝试转换为 NSString 会导致空字符串。 现在最奇怪的是,当我尝试调试代码并设置断点(如上所示)时,我的 NSString 突然变为有效!
那又如何——我的测量改变了结果?很久以前的物理课听起来很熟悉,但我怀疑这里涉及到量子力学。
注意:
我暂时省略了myCFunctionReturningConstCharPtr() 的实现,因为它会增加另一层可能与当前问题无关的复杂性(涉及多个 c++ 库,字符串已从 char 指针转换为 std ::字符串并返回)。
这两天我一直在努力解决这个问题,非常感谢任何帮助!谢谢
编辑:
字符串最初来自 PowerVR 的 Insider SDK 中的结构 SPODNode。
我们有:
struct SPODNode {
PVRTchar8 *pszName;
// ...
}
与:
typedef char PVRTchar8;
在我的代码中:
std::string MyCppClass::pvrNodeName() {
if (node && node->pszName) {
string stdName(node->pszName);
return stdName;
}
return string();
}
最后在myCFunctionReturningConstCharPtr():
const char * myCFunctionReturningConstCharPtr() {
std::string stdString = myCppClassInstace->pvrNodeName()
return stdString.c_str();
}
希望对你有帮助!
【问题讨论】:
-
我怀疑
myCFunctionReturningConstCharPtr()。可以展示一下吗? -
不是那么容易,涉及的代码太多。我将尝试将其分解并将其添加到我的问题中。我希望给定的例子能代表它本身。
-
我对您的
const char*的返回方式很感兴趣。尤其是通过调用data()或c_str()从本地std::string对象获取。 -
你至少能显示“正确字符串”的输出吗?是否涉及任何非 ASCII 字符?如果字符串不是正确的 UTF-8,
stringWithUTF8String将失败。 -
字符串“foo”也会出现问题
标签: c++ objective-c