LINUX.ORG.RU

C++ - как правильно записать число в строку

 ,


1

3

Такой внезапно не совсем понятный вопрос - как в крестах/сишке можно записать данные из переменной типа int в string? Поиск дает какие-то жуткие костыли, неужели нет нормального способа сделать это средствами языка?

★☆

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

Шел 2016 год, в плюсах нет одного нормального способа сконвертировать число в строку.

Есть начиная с c++11.

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

Так что остается snprintf

Которого нет в студии

#if _MSC_VER <= 1800
#define snprintf(buffer, maxlength, format, ...) _snprintf(buffer, maxlength - 1, format, __VA_ARGS__)
#endif
andreyu ★★★★★
()
Ответ на: комментарий от andreyu

#define snprintf(buffer, maxlength, format, ...) _snprintf(buffer, maxlength - 1, format, __VA_ARGS__)

#include <iostream>
#include <string>
using namespace std;

#define snprintf(buffer, maxlength, format, ...) _snprintf(buffer, maxlength - 1, format, __VA_ARGS__)

int main()
{
    char str[] = "Fuck You!!!";
    char buf[4] { ' ', ' ', ' ', ' ' };
    
    snprintf( buf, 4, "%d", 123 );
    
    
    std::cout << buf;
}
anonymous
()
Ответ на: комментарий от Gvidon

Почему-то никого не смущает линуксовое ядро, которое до сих пор пишется на gnu89

Ну так оно и собирается по факту только gcc, и никакой переносимости и совместимости нет. Потому «89» тут просто предпочтение его основных разрабочиков.

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

Почему-то никого не смущает линуксовое ядро, которое до сих пор пишется на gnu89

А зачем тогда нужен C++14? :-)

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

itoa это что-то замшелое и покрытое мохом. Непереносимое и отсутствующее в стандартных библиотеках. Кажется этот костыль был предложен в K&R.

зато atoi - очень даже существующее и переносимое =)
как минимум в unix-подобных системах. А вообще функция простая, можно и руками запилить.

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

Вы хотели что-то сказать, но у вас не получилось?

Тебе домашнее задание - разобрать, почему этот пример тебе выведет строку «123 Fuck You!!!» на экран, хотя размера буфера достаточно для хранения результата.

anonymous
()

крестах/сишке

из переменной типа int в string

уходи

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

C99 разрешает «maxlength» быть 0 же?

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

Шёл 2016 год, на ЛОРе до сих пор разводят тупые неосиляторские треды про C/C++.

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

Тебе домашнее задание - разобрать, почему этот пример тебе выведет строку «123 Fuck You!!!» на экран, хотя размера буфера достаточно для хранения результата.

Не нужно свое домашнее задание перекидывать на других.

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

Не нужно постить свой говнокод как пример решения.

Говнокод у вас, а виновато мое предложение? Вам бы в клоуны идти, потешный вы наш.

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

Не надо за всех говорить. Если отрефакторить ведро и собирать тем шлангом со всеми варнингами и с -Werror то кучу багов можно предотвратить.

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

-Wall:

warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Wformat=]

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

Говнокод у вас, т.к. сфейлится при maxlength = 0.

Это как бы очевидно для любого, у кого есть мозг.

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

Говнокод у вас, т.к. сфейлится при maxlength = 0.

Да тут даже не в нем дело. А в том, что данный код, записанный через его макрос:

snprintf( buf, 4, "%d", 123 );

не добавит \0 в конец строки, хотя он там влазит. А результат вернется такой, что при его проверке все будет выглядеть так, будто \0 был записан.

П.С. и самое главное, что этот дурень в упор этого не видит даже с готовым примером, как таким людям компилятор можно доверить?

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

В жаве некрасиво реализовывается для типов-значений.

nikolnik ★★★
()

snprintf в си. Аналогично в плюсах.

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

C++11 вам нужен потому что, каким флагом он включается сами нагуглите

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

Вместо того, что бы убрать единичку, вы развели тут ужасную вонь. При этом не предложили какого-либо решения. Анонимусы такие анонимусы.

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

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

Откуда убрать? Ты так и не понял, что _snprintf не добавляет \0 в конец и «единичками» тут дело не исправить? Насчет вони - я привел пример кода, который показал твою ошибку. А ты, вместо того, чтоб попытаться подумать, или хотя бы запустить пример, встал в позу и начал умничать. Потому может «вонь» тут я и развел, но твой глупости и упертости тут не меньше.

П.С. и, да, _snprintf я ни разу в жизни не пользовался, но мне хватает ума читать документацию к тому, что я вижу, а уж тем более к тому, что я хочу использовать или посоветовать другому.

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

Ты так и не понял, что _snprintf не добавляет \0 в конец и «единичками» тут дело не исправить?

У вас какой-то особенный _snprintf, который не добавляет null? https://msdn.microsoft.com/en-us/library/aa298594(v=vs.60).aspx

Насчет вони - я привел пример кода, который показал твою ошибку.

Вы привели говнокод.

А ты, вместо того, чтоб попытаться подумать, или хотя бы запустить пример, встал в позу и начал умничать. Потому может «вонь» тут я и развел, но твой глупости и упертости тут не меньше.

Ваши аргументы строятся на какой-то только вам одному ведомой реализации _snprintf, которая почему-то не добавляет терминирующий null.

, да, _snprintf я ни разу в жизни не пользовался,

Это заметно.

но мне хватает ума читать документацию к тому, что я вижу, а уж тем более к тому, что я хочу использовать или посоветовать другому.

В каком же месте вы прочли эту документацию?

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

И да, вместо предложения решения задачи вы снова развели вонь.

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

У вас какой-то особенный _snprintf, который не добавляет null?
https://msdn.microsoft.com/en-us/library/aa298594(v=vs.60).aspx

«Visual Studio 6.0» - во-первых уже была ссылка на актуальную документацию. Во-вторых, твоя же ссылка:

The _snprintf function formats and stores count or fewer characters and values (including a terminating null character that is always appended unless count is zero or the formatted string length is greater than or equal to count characters) in buffer

English, motherfucker, do you speak it?

Ваши аргументы строятся на какой-то только вам одному ведомой реализации _snprintf, которая почему-то не добавляет терминирующий null.

Ну я понимаю ты упорный идиот, но запусти уже пример и убедись.

Это заметно.
В каком же месте вы прочли эту документацию?

Забудь про программирование, сделай миру одолжение.

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

«Visual Studio 6.0» - во-первых уже была ссылка на актуальную документацию. Во-вторых, твоя же ссылка:

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

«_snprintf returns the number of bytes stored in buffer, not counting the terminating null character. If the number of bytes required to store the data exceeds count, then count bytes of data are stored in buffer and a negative value is returned.»

Ну я понимаю ты упорный идиот, но запусти уже пример и убедись.

Убедиться в вашем говнокоде? Я это и без компиляции вижу.

Забудь про программирование, сделай миру одолжение.

И это мне говорит автор говнокода выше? Вам бы в клоуны идти.

andreyu ★★★★★
()
Последнее исправление: andreyu (всего исправлений: 1)
Ответ на: комментарий от anonymous

И снова вместо решения задачи анонимус пускает пузыри.

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

У вас какой-то особенный _snprintf, который не добавляет null?
Сделайте усилие, почитайте еще один обзац и научитесь проверять результат выполнения функции:

Отлично, идиот хотя бы уже понял, что лоханулся, но решил пошланговать на другую тему. А теперь вспомним, что этот идиот предлагал завернуть _snprintf в макрос snprintf. И что результат этих функций в данном случае различается. Итого данный homo-idiotus предлагает проверять результат snprintf пользуясь докой от _snprintf. Шикарно.

Убедиться в вашем говнокоде? Я это и без компиляции вижу.

Говнокод он исключительно по одной причине - вместо оригинального snprintf там твой кривой макрос.

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

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

p.s. Шлангуете тут только вы. Надеюсь вам на вилку пробку одевают, дабы вы не выкололи себе глаз.

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