Строка таинственно исчезает, перенося строку из C ++ в Obj C ++

0

Я уверен, что это что-то простое, но я не могу понять это. Я в основном пытаюсь использовать c++ для создания строки HTML и вернуть ее для хранения в объектном классе модели 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>

Ниже приведен код, вызывающий его в отдельном файле 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 для преобразования строки ac в NString. Это работало для меня в прошлом, но по какой-то причине, в обоих выводах NSLog, я ничего не получил. Строка просто таинственно исчезает.

Не могли бы вы порекомендовать то, что может быть причиной этого?

----- UPDATE ---- Следуя рекомендациям по отставке ниндзя, я попытался убедиться, что указатель, на который ссылается, не соответствует переменной, которая выпала из сферы действия. У меня был класс Result model c++, который я успешно передал моему объекту c++. Я решил добавить элемент данных, fields_map_as_html, и передать эту функцию, а не коду obj c++.

  • 3
    Вы возвращаете указатель на локальную переменную, которая сразу выходит из области видимости.
  • 0
    Кроме того, stringWithUTF8String подходит только в том случае, если вы уверены, что передаете текст в формате UTF8.
Показать ещё 3 комментария
Теги:
xcode
objective-c++
nsstring

1 ответ

1
Лучший ответ

SqliteConnection::htmlTest() возвращает указатель на локальную переменную, выходящую за пределы области видимости, поэтому она больше не действительна. Вместо этого вы можете вернуть "std :: string" и извлечь данные в вызывающей функции или использовать какой-либо другой метод, чтобы убедиться, что данные зависают, пока вы его не используете.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню