2012-06-29 1 views
1

Я пытаюсь преобразовать int в строку cstring. Я решил прочитать int в регулярную строку через stringstream, а затем прочитать строку в массив char. Кажется, что все работает, но мне интересно, удастся ли мне с моим компилятором повезти. Звучит ли код? Благодаря!Преобразование строки в строку стиля C

int zip = 1234;  

char zipString[30]; 

stringstream str; 

str << zip; 

str >> zipString; 

cout << zipString; 
+1

лучше переместить этот вопрос на http://codereview.stackexchange.com/ – ArtemStorozhuk

+0

Любая причина, по которой вам нужно иметь строку как c-строку, а не строку 'std :: string'? Последний, как правило, намного лучший вариант, если вы не уцелели устаревшим кодом. –

+0

Мне нужно иметь дело с каждым «целым числом» в строке независимо. Казалось, что массив позволит мне забрать их, чтобы они были самыми легкими. – AlmostSurely

ответ

4

Вы можете получить C++ std::string из str() функции ручья, и неизменный C-стиль нуля строка из c_str() функции струны:

std::string cpp_string = str.str(); 
char const * c_string = cpp_string.c_str(); 

Вы могли бы попытаться объединить их в одно выражение, str.str().c_str(), но это будет Неправильно; строка C++ будет уничтожена, прежде чем вы сможете что-либо сделать с помощью указателя.

То, что вы делаете, будет работать, если вы уверены, что буфер достаточно велик; но использование строки C++ устраняет опасность переполнения буфера. В общем, лучше избегать строк C-стиля, если вам не нужно использовать API, который их требует (или, в крайних случаях, в качестве оптимизации, чтобы избежать выделения памяти). std::string обычно безопаснее и проще в работе.

+0

Спасибо! Из любопытства вы посоветуете делать то, что я сделал? – AlmostSurely

+0

Вы правы! Я думал, что 'stringstream.str()' возвращено 'std :: string &', а не 'std :: string' :) – dasblinkenlight

+1

@IniquiTrance: В общем, я бы посоветовал использовать строки' std :: string' для строк, если нет веской причины использовать что-то еще. –

1

std::stringc_str() Функция-член возвращает const char* (aka строка в стиле C).

std::string str = "world"; 
printf("hello, %s", str.c_str()); 
2

Если у вас есть конкретные причины, что вам нужно массив полукокса вместо стандартной строки, я бы использовать последний. Хотя это не является строго необходимым в этом случае, я обычно также использовать подталкивание lexical_cast вместо того, чтобы явно трогательные вещи через stringstream сделать преобразование:

std::string zipString = lexical_cast<std::string>(zip); 

Тогда, если вам действительно нужен результат как c- style string, вы можете использовать zipString.c_str(), чтобы получить это (хотя он по-прежнему отличается одним способом - вы не можете изменить то, что возвращается).

В этом конкретном случае это не принесет вам многого, но последовательное использование конверсий в этом общем порядке складывается, и если вы собираетесь это сделать, вы также можете использовать его здесь.

+0

Вы получаете быстрое поведение, которого много. Я никогда не видел целых сбоев проверки потока проверки организации (включая @IniquiTrance). –

+0

@TomKerr: хорошая точка. –