LINUX.ORG.RU

Ответ на: комментарий от anonymous

> Еще один пример «красоты» Плюсов.

Скорее, его стандартной либы, которую забыли посолить в нескольких местах. Но и про сам язык я особо много хорошего не скажу ;)

const86 ★★★★★
()

А с использованием сишного sprintf разве плохо?

anarquista ★★★★★
()
Ответ на: комментарий от dimon555

> у стринга должен быть метод format или что-то в этом духе

Традиционный format содержит небезопасные преобразования типов. А std::sstream безопасен, но коряво юзается.

const86 ★★★★★
()
Ответ на: комментарий от mv

мммм, тогда такой вопрос от неопытного человека опытному, это нормально ради обычного преобразования типов подключать boost?

z0D5e8n7x_2
() автор топика
Ответ на: комментарий от z0D5e8n7x_2

просто ощущение, что это забивание гвоздей микроскопом

z0D5e8n7x_2
() автор топика

блин, зря я перед сном зашел в Dev, теперь после такого кошмары будут сниться.

mono ★★★★★
()

С++ не обижайте! Такие преобразования между числами и строками должны решаться не средствами языка, а библиотеками. С++ и С это С++ и С. И не их задача решать сложные комплексные задачи перевода чисел в строки, имеющие множество вариантов в своих решениях.

anonymous
()
Ответ на: комментарий от z0D5e8n7x_2

Многие считают буст частью стандартной библиотеки C++.

Legioner ★★★★★
()
Ответ на: комментарий от Zloddey

это просто обертка для vsnprintf, как вариант:

/****************************************************************************** ****************/
std::string Format( const char* frmt, ... )
{
    static char buf[ 4096 ];
    buf[ 0 ] = 0;

    va_list args;
    va_start( args, frmt );
    vsnprintf( buf, 4096, frmt, args );
    va_end( args );

    return std::string( buf );
}

и пользоваться так:

std::string str = Format( "%d", sum ); 
lester ★★★★
()
Ответ на: комментарий от Zloddey

Не хочешь boost? Подключай wxWidgets! Там тоже всё просто и удобно делается:

Чего так скромно? Давай уже сразу Qt:

int number = 10;
QString str = QString("%1").arg(number);

lester_dev ★★★★★
()
Ответ на: комментарий от z0D5e8n7x_2

std::string умеет мимикрировать под обычную C-строку, поэтому слегка извернувшись можно использовать atoi/itoa.

Почитай Джосьютиса

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

>std::string умеет мимикрировать под обычную C-строку, поэтому слегка извернувшись можно использовать atoi/itoa.

Нельзя, c_str() дает const

lester_dev ★★★★★
()

snprintf юзай. удобно и безопасно

Reset ★★★★★
()
Ответ на: комментарий от z0D5e8n7x_2

> мммм, тогда такой вопрос от неопытного человека опытному, это нормально ради обычного преобразования типов подключать boost?

Если только ради этого - нет. Как уже сказали, буст можно рассматривать, как стандартную плюсовую библиотеку, ибо официальная по сравнению с другими языками крайне бедно выглядит.

mv ★★★★★
()
Ответ на: комментарий от Zloddey

> Не хочешь boost? Подключай wxWidgets! Там тоже всё просто и удобно делается:
> const char* mystr = wxString::Format(wxT("%d"), number).mb_str()


а ничего что ты берешь буфер от временного объекта, который тут же разрушается? если с gcc такое в большинстве случаев и будет работать, то с msvc тут очень большая вероятность словить креш

lester ★★★★
()
Ответ на: комментарий от z0D5e8n7x_2

мать вашу, получается в лучшем случае это выглядит так?

Ну всего три строчки, не так уж и страшно :) Можно написать себе упрощалку на будущее, если буст заряжать очень уж не хочется:

class format {
	std::stringstream ss;
public:
	template<typename T>
	format &operator <<(const T &x) { ss << x; return *this; }
	operator std::string() { return ss.str(); }
};

std::string s = format() << 17 << ' ' << 42;

Или можно списать printf из http://en.wikipedia.org/wiki/C%2B%2B0x#Variadic_templates

const86 ★★★★★
()
Ответ на: комментарий от lester_dev

>>std::string умеет мимикрировать под обычную C-строку, поэтому слегка извернувшись можно использовать atoi/itoa.

Нельзя, c_str() дает const

Этот конст замечательно зохавает atoi() и не поморщится =) Ну а для обратного преобразования, которое нужно топикстартеру, да, придется временный буффер заюзать

yoghurt ★★★★★
()

А вообще, надо написать свой класс для строки и держать весь проект на нём. Так-то!

yoghurt ★★★★★
()
Ответ на: комментарий от anonymous

Тем, что отсутствует динамическое выделение памяти под результат.

linuxfan
()
Ответ на: комментарий от Dikar

> функция языка Си, не входящая в стандарт языка

Удачи.

bvvv
()
Ответ на: комментарий от lester

>а ничего что ты берешь буфер от временного объекта, который тут же разрушается? если с gcc такое в большинстве случаев и будет работать, то с msvc тут очень большая вероятность словить креш

Почему тут же? До конца метода объект wxString полностью в моём распоряжении. Именно так под msvc и делаю.

Zloddey
()
Ответ на: комментарий от Zloddey

> Почему тут же? До конца метода объект wxString полностью в моём распоряжении.

за исключением того факта, что у него отрабатывает деструктор и ты получаешь указатель на область памяти, которая «официально» считается уже неиспользуемой, какие веселые и «случайные» баги( особенно при -O2 ) можно из-за этого словить думаю рассказывать не стоит, потому я б рекомендовал не ленится и делать так:

wxString str;
str.Printf( «%d», num );

lester ★★★★
()
Ответ на: комментарий от lester

> за исключением того факта, что у него отрабатывает деструктор

wxString::Format() - это разве не static-функция?

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.