gpt4 book ai didi

c++ - 尝试将 const char * 转换为 NSString 时为空字符串

转载 作者:行者123 更新时间:2023-11-30 01:59:59 25 4
gpt4 key购买 nike

我在尝试从 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
}

来 self 的 c 方法的 const char 很好地打印到控制台。但是尝试转换为 NSString 会导致空字符串。现在最奇怪的是,当我尝试调试代码并设置断点(如上所示)时,我的 NSString 突然变得有效!

那又怎样——我的测量改变了结果?很久以前在物理课上听起来很熟悉,但我怀疑这里涉及量子力学。

注意:

我现在省略了 myCFunctionReturningConstCharPtr() 的实现,因为它会增加另一层可能与当前问题无关的复杂性(涉及多个 c++ 库,字符串有已从 char 指针转换为 std::string 并返回)。

两天来我一直在努力解决这个问题,非常感谢任何帮助!谢谢

编辑:

该字符串最初来自 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();
}

希望对您有所帮助!

最佳答案

The const char * is obtained by calling .c_str() on a std::string.

您的程序很可能有未定义的行为,因为您正在返回一个指向字符数组的指针,该字符数组在从函数 myCFunctionReturningConstCharPtr() 返回时被释放。

实际上,你返回的那个const char*指向一个字符数组,这个字符数组被一个本地std::string对象封装; std::string 对象的析构函数释放该数组,当本地对象超出范围时调用析构函数,即从函数返回时。

稍后尝试取消引用您收到的指针会导致未定义的行为,这意味着任何事情都可能发生。这包括您的程序在调试时似乎运行良好,但在没有附加调试器的情况下运行时却不行。

你应该让你的函数返回(按值)一个std::string,如果你需要得到封装的,然后在返回值上调用c_str() C 字符串:

std::string charString = myCFunctionReturningConstCharPtr(); 
printf("%s \n", charString.c_str()); // prints the correct string

关于c++ - 尝试将 const char * 转换为 NSString 时为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15598392/

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