C++ 尝试将常量字符*转换为NSString时为空字符串
我在尝试从const char*获取NSString时遇到了一个奇怪的错误C++ 尝试将常量字符*转换为NSString时为空字符串,c++,objective-c,C++,Objective C,我在尝试从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... NS
// 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突然变为有效
那么,我的测量改变了结果?很久以前的物理课听起来很熟悉,但我怀疑这里涉及到量子力学
注:
我现在省略了<代码> MyCalfRealTurnCysChptrd()/Cube >的实现,因为它将添加另一层复杂性,这可能与当前问题无关(涉及到多个C++库,字符串已经从char指针转换为STD::String和Bead)。p> 这两天来,我一直在为此事绞尽脑汁,非常感谢您的帮助!谢谢
编辑: 该字符串最初来自PowerVR的InsiderSDK的structSPODNode
。
我们有:
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*是通过对std::字符串调用.c_str()获得的
您的程序很可能有未定义的行为,因为您正在返回一个指向从函数myCFunctionReturningConstCharPtr()
返回时被释放的字符数组的指针
事实上,constchar*
返回指向由本地std::string
对象封装的字符数组;std::string
对象的析构函数解除分配该数组,当本地对象超出范围时,即从函数返回时,将调用析构函数
稍后尝试取消引用您收到的指针会导致未定义的行为,这意味着任何事情都可能发生。这包括您的程序在调试时似乎运行良好,但在未连接调试器的情况下运行时却不正常
您应该让函数(按值)返回一个std::string
,然后在需要获取封装的c字符串时对该返回值调用c_str()
:
std::string charString = myCFunctionReturningConstCharPtr();
printf("%s \n", charString.c_str()); // prints the correct string
const char*是通过对std::字符串调用.c_str()获得的
您的程序很可能有未定义的行为,因为您正在返回一个指向从函数myCFunctionReturningConstCharPtr()
返回时被释放的字符数组的指针
事实上,constchar*
返回指向由本地std::string
对象封装的字符数组;std::string
对象的析构函数解除分配该数组,当本地对象超出范围时,即从函数返回时,将调用析构函数
稍后尝试取消引用您收到的指针会导致未定义的行为,这意味着任何事情都可能发生。这包括您的程序在调试时似乎运行良好,但在未连接调试器的情况下运行时却不正常
您应该让函数(按值)返回一个std::string
,然后在需要获取封装的c字符串时对该返回值调用c_str()
:
std::string charString = myCFunctionReturningConstCharPtr();
printf("%s \n", charString.c_str()); // prints the correct string
我怀疑myCFunctionReturningConstCharPtr()
。你能展示一下吗?不太容易,涉及的代码太多了。我会尝试将其分解并添加到我的问题中。我希望给出的示例能够代表它自己。我对返回const char*
的方式感兴趣。特别是,无论它是通过调用data()
或c_str()
从本地std::string
对象获得的。您至少可以显示“正确字符串”的输出吗?是否涉及任何非ASCII字符<如果字符串UTF-8不正确,则代码>字符串WithUTF8String
将失败。我怀疑字符串“foo”也会出现此问题myCFunctionReturningConstCharPtr()
。你能展示一下吗?不太容易,涉及的代码太多了。我会尝试将其分解并添加到我的问题中。我希望给出的示例能够代表它自己。我对返回const char*
的方式感兴趣。特别是,无论它是通过调用data()
或c_str()
从本地std::string
对象获得的。您至少可以显示“正确字符串”的输出吗?是否涉及任何非ASCII字符<如果字符串UTF-8不正确,则代码>字符串WithUTF8String将失败。字符串“foo”也会出现问题。请参阅上面我更新的问题中的代码。据我所知,我就是这么做的。我正在使用c_str()转换我的std字符串。结果是一个常量,因此在返回它时仍然有效。还是我遗漏了什么?@de:不,这是无效的。正如我在回答中所写,该字符数组由本地std::string
对象拥有,当它超出范围时,该字符数组将被删除。按照我的建议,返回一个std::string
,而不是const char*
。好的,我明白了。但我必须转换为C,因为我的API是C,没有C++。@ DE。在这种情况下,你可以分配一个新的字符数组,并复制一个由代码> CyScript()/<代码>返回。在这种情况下,客户机将负责对其执行delete[]
。或者,您可以让客户端向您的函数传递一个缓冲区,这样函数本身只需将c_str()
的结果复制到其中,而无需分配它。在我看来,这个解决方案更好,因为客户端可以选择如何分配缓冲区(无论是在堆栈上还是在堆上)。谢谢Andy,我将遵循您的第二个建议。希望如此