Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2015, 09:37   #1
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию Как подсунуть переменную в sprintf

Здравствуйте господа гуру С++

Вопрос от чайника С++:
Как посдунуть переменную в sprintf, то есть:
у меня есть функция

Код:
const char * _getIntMask(unsigned int size) {
  if (size>16) return "";
  char ret[6]; memset(ret,0,6);
  sprintf(&ret[2], "%d", size);
  ret[0]='%';ret[1]='0';
  ret[4-(size<10)]='d';
  return ret;
}
возвращает маску в формате %0xxd
нужно её подсунуть в sprintf(buffer, mask, 20) для формирования строки заданной ширины из числового значения с выравниванием по левому краю
32 => 0000032
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 07.06.2015, 10:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
char ret[6]; memset(ret,0,6);
Не прокатит. Используй malloc() для создания массива символьного, и его (всмысле полученный указатель) уже возвращай.
Тогда
Код:
char *mask=_getIntMask(...);
sprintf(buffer, *mask, 20);
delete mask;
Так! Стопэ!!! Это ты на Билдере пишешь? Если да то почему не используешь его классы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.06.2015, 10:36   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Спасибо огромное !
ПРокатило
Код:
const char * _getIntMask(unsigned int size) {
  if (size>16) return "";
  char * ret = "%00d";
  sprintf(&ret[2], "%d", size);
  ret[0]='%';  ret[1]='0';
  ret[4-(size<10)]='d';
  return (const char*) ret;
}
------------
по поводу классов.
Основное требование заказчика - примитивность функций для возможного переноса на разные платформы и компиляторы.
п.с. к счастью я не пишу на С++, а всего лишь перевожу написаный на Паскале (Делфи код). Мне как то по душе Делфи =))
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 07.06.2015, 14:12   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

А зачем такие сложности?
Ширину можно передавать в качестве аргумента printf():
printf("%*d", width, value);

Ref:
http://www.cplusplus.com/reference/cstdio/printf/
waleri вне форума Ответить с цитированием
Старый 07.06.2015, 17:25   #5
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
А зачем такие сложности?
Ширину можно передавать в качестве аргумента printf():
printf("%*d", width, value);
http://www.cplusplus.com/reference/cstdio/printf/
если бы было просто, я бы у гугла спросил а не у Гуру форума.
------------
Стоит задача написать функцию следующего вида

setvalue(char * dest, uint size, int value)
где
dest - резултирующий дамп памяти (по сути строка)
size - размер строки
value - значение
------------
функция используется в конверторе, который заполняет определённые части строки....
например "xxxx00000wwwwyyyaaaaaaaaaa"
нужно в знакоместа отмеченные "y" всунуть число 15, причём так, что бы слева были нули, или пробелы.
В примитивной части С++ (без VCL составляющей) существует набор функций с корнем "prinf" которые форматируют целое, и формат %0d который дописывает слева нули. Так вот, функция служит для того, чтобы подавая на вход размер нужной мне части я получал нужный результат
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 07.06.2015, 17:49   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я, если честно тоже не вижу смысла в _getIntMask, если она именно такая, как представлено здесь. Проще определить константами заранее необходимые шаблоны, а тернарным оператором их применять в sprintf().
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.06.2015, 20:42   #7
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Я, если честно тоже не вижу смысла в _getIntMask, если она именно такая, как представлено здесь. Проще определить константами заранее необходимые шаблоны, а тернарным оператором их применять в sprintf().
%01 - %12d
"завтра" могут выпустить новую. версию спецификации формата, появится %13d %14d и.т.п
-----------
+добавил "о смысле"
Стараюсь писать гибкие универсальные элементы которые могут использоваться в многих случаях. Константа - это плохой тон, который заключается в привязке кода к какому то типу (набору данных). Я так не работаю.
Приведу простейший пример, функция пересечения двух отрезков. При написании по методу "давайте зашьём шаблонами все варианты" алгоритм загибается при первой же проверке полностью совпадающих отрезков, или частично перекрывающихся.
Простыми словами, все случаи в жизни константами не описать, их будет слишком много.
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 09.06.2015 в 20:47.
JUDAS вне форума Ответить с цитированием
Старый 10.06.2015, 08:48   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Константа - это плохой тон, который заключается в привязке кода к какому то типу (набору данных).
Используй ИНИ файлы. Храни там "константы". Это дешевле, чем изобретать костыли.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.06.2015, 09:38   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так! Стопэ!!! Это ты на Билдере пишешь? Если да то почему не используешь его классы?
Я его понимаю. Он пишет в Билдере, но в консольном режиме. Кстати, да. И в косольке можно прикрутить windows.h, тогда и AnsiString будет доступен. Но, невзирая на среду программирования, ему всё-же нужен просто СИ++, а этих "подлянок" от Борланда в нём нет.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Используй ИНИ файлы. Храни там "константы". Это дешевле, чем изобретать костыли.
Дельный совет. ТС, прислушайтесь. Я и сам так, порой, поступаю. Хотя это и считается сейчас "плохим стилем". Советуют всё в реестр писать. Мне это не нравится. Нахрена гадить .

Цитата:
Сообщение от JUDAS Посмотреть сообщение
Простыми словами, все случаи в жизни константами не описать, их будет слишком много.
И не нужно. Константы, потому и константы, что они НЕ МЕНЯЮТСЯ. Ярчайший пример - число ПИ. Как не крути, как ни вычисляй первые 3 цифры будут 3,14.
А для "всех случаев", существуют массивы, структуры, объединения, классы в конце-концов.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 10.06.2015 в 09:50.
Smitt&Wesson вне форума Ответить с цитированием
Старый 10.06.2015, 10:10   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от JUDAS Посмотреть сообщение
В примитивной части С++ (без VCL составляющей) существует набор функций с корнем "prinf" которые форматируют целое, и формат %0d который дописывает слева нули. Так вот, функция служит для того, чтобы подавая на вход размер нужной мне части я получал нужный результат
Я не понял, а так не работает?>
printf("%0*d", size, value)
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
аналог String.Format/sprintf Пепел Феникса JavaScript, Ajax 1 14.06.2011 09:51
Проблема с sprintf Slava-D Общие вопросы C/C++ 7 25.05.2011 14:57
Формирование строк как в sprintf() LukS Общие вопросы C/C++ 2 15.10.2009 17:28
Как подсунуть параметр в Query после Union? Корчеватель Паскаль, Turbo Pascal, PascalABC.NET 0 18.05.2009 21:58
Ошибка линвки (функция sprintf) LukS C/C++ Сетевое программирование 21 25.01.2009 13:58