2013-12-23 48 views
0

我確定這很簡單,但我似乎無法弄清楚。我基本上是試圖用C++來生成一個HTML字符串並將其返回以存儲在一個客觀的c模型類中,以便稍後在web視圖中使用。字符串神祕地消失將字符串從C++帶到Obj C++

它的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> 

下面的代碼在一個單獨的目的調用它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交流字符串轉換爲NString。這在過去對我有用,但由於某種原因,在兩個NSLog輸出中,我什麼都沒有返回。該字符串神祕地消失。

你能推薦什麼可能導致此?

----- UPDATE ---- 根據退休忍者的建議,我試圖確保引用的指針不是一個超出範圍的變量。我有一個Result模型C++類,我成功傳遞給了我的obj C++代碼。我決定添加一個數據成員fields_map_as_html,並將函數傳遞給它,而不是傳遞給我的obj-C++代碼。

+3

您正在返回一個指向立即超出範圍的局部變量的指針。 –

+0

此外,stringWithUTF8String僅適用於您確定要傳遞UTF8文本。 – StilesCrisis

+0

@StilesCrisis - 我之前讀過這篇文章,但我不確定我如何能夠驗證我所傳遞的信息。任何建議? – ThinkBonobo

回答

1

SqliteConnection::htmlTest()正在返回一個指向局部變量的指針,該局部變量超出了範圍,因此它不再有效。您可以返回一個`std :: string,並在調用函數中提取數據,或使用其他方法來確保數據在您使用之前掛起。