字符串神秘地消失了从C ++到Obj C ++的字符串

时间:2013-12-23 23:47:22

标签: c++ objective-c xcode nsstring objective-c++

我确信这很简单,但我似乎无法弄明白。我基本上试图使用c ++生成一个HTML字符串并将其返回存储在一个客观的c模型类中,以便稍后在Web视图中使用。

它的c ++方面似乎运行良好。这是在cpp文件中调用的方法:

const char *SqliteConnection::htmlTest(){
    HtmlItemValueTableBuilder htmlBuilder = HtmlItemValueTableBuilder();
    std::string s = htmlBuilder.test();
    cout << "TEST RESULT: " <<s;
    return s.c_str();
}

cout产生以下输出(这就是我想要的):

TEST RESULT: <!doctype html><html><head></head><div><STYLE type="text/css"> body {      margin: 10%;  }  table {    border-spacing: 5px;  }  td {     background-color: #EFEFEF;    font-size: 20px;    padding: 4px;    padding-left: 4px;    padding-right: 4px;  }  tr {    margin-bottom: 10px;    margin-top: 10px;  } </STYLE><table><thead></thead><tbody>
<tr><td>hello</td><td>world</td></tr>
</tbody></table></div></html>

以下是在单独的Objective c ++(。mm)文件中调用它的代码:

-(NSString *)getFieldsMapAsHtmlForResult:(Result *)result {
    const char *s = _sqliteConnection->htmlTest();
    NSLog(@"Before Conversion: %s", s);
    NSString *htmlString = [NSString stringWithUTF8String:s];
    NSLog(@"After Conversion: %@",htmlString);
    return htmlString;
}

我见过很多人建议使用stringWithUTF8String将c字符串转换为NString。这在过去对我有用,但出于某种原因,在两个NSLog输出中,我都没有得到任何回报。绳子神秘地消失了。

你能推荐一些可能导致这种情况的原因吗?

-----更新---- 在退役忍者的建议之后,我试图确保引用的指针不是一个超出范围的变量。我有一个Result模型c ++类,我成功传递给我的obj c ++代码。我决定添加一个数据成员fields_map_as_html,并将函数传递给它而不是我的obj-C ++代码。

1 个答案:

答案 0 :(得分:1)

SqliteConnection::htmlTest()返回一个指向超出范围的局部变量的指针,因此它不再有效。您可以返回一个`std :: string,并在调用函数中提取数据,或者使用其他方法确保数据在您使用之前保持不变。