Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 尝试将常量字符*转换为NSString时为空字符串_C++_Objective C - Fatal编程技术网

C++ 尝试将常量字符*转换为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

我在尝试从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突然变为有效

那么,我的测量改变了结果?很久以前的物理课听起来很熟悉,但我怀疑这里涉及到量子力学

注:

我现在省略了<代码> MyCalfRealTurnCysChptrd()/Cube >的实现,因为它将添加另一层复杂性,这可能与当前问题无关(涉及到多个C++库,字符串已经从char指针转换为STD::String和Bead)。p> 这两天来,我一直在为此事绞尽脑汁,非常感谢您的帮助!谢谢

编辑:

该字符串最初来自PowerVR的InsiderSDK的struct
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*是通过对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,我将遵循您的第二个建议。希望如此