2015-09-12 4 views
1

Я пытался добавить целое число в строку, и я попытался несколько решений здесь, в том числе:Строка поток приходит пустой

std::stringstream ss; 

ss << gvHours << "\'" << gvMinutes << "\"" << gvSeconds << ":" << gvTicks; 

std::string output(ss.str()); 
return output.c_str(); 

и

std::stringstream ss; 
std::string output = ""; 

ss << gvHours << "\'" << gvMinutes << "\"" << gvSeconds << ":" << gvTicks; 

output = ss.str(); 
return output.c_str(); 

Первый один дает мне пустую строку, а вторая дает мне нечитаемый символ, который Notepad ++ отображает как «SOH» в черном ящике. Кто-нибудь знает, что я делаю неправильно?

+3

См http://stackoverflow.com/questions/6441218/can-a-local-variables -Память-быть-доступ-вне-его-сферу. Вероятно, это причина вашей проблемы. И в зависимости от того, как вы просматриваете строку, она может быть пустой, потому что она состоит из невидимых символов. Например, SOH является управляющим символом «Начало заголовка» (ASCII-код 2). – chris

+0

@chris Хорошая догадка! –

+0

Зачем вам все равно возвращать C-строку? lol –

ответ

4

Да, эта часть

return output.c_str(); 

сломана.

Когда вы берете c_str() из std::string, вы просто получаете указатель c-стиля к содержимому этой строки. Но вы не Получение собственности данных, лежащих в основе этой строки. Как только вы вернетесь из функции, этот stringstream и string будут уничтожены (поскольку они являются локальными переменными), а c_str() - это оборванный указатель. Таким образом, все это неопределенное поведение.

+0

Итак, должен ли я сделать указатель на новый const char * и вернуть это вместо этого? –

+0

@KelvinShadewing, возврат строки 'std :: string' является наиболее очевидным советом, но я предполагаю, что у вас есть причина не делать этого. – chris

1

Я исправил его. Вот код, который я получил, что работает:

std::stringstream ss; 
std::string output; 

ss << gvHours << "\'" << gvMinutes << "\"" << gvSeconds << ":" << gvTicks; 

output = ss.str(); 
return output; 

И в функции, где она была необходима:

fprintf(gvLog, ">: %s\n", timeString().c_str()); 
+0

Обратите внимание, что у вас нет способа удалить этот динамически выделенный строковый объект. Вы пропускаете одну строку за звонок. – chris

+0

Отредактировано. Думаю, это должно исправить утечку памяти. –

+0

Да, это работает. – chris

Смежные вопросы