Я играю с принтом и идеей
написать my_printf (...), который вызывает обычный printf
и sprintf, который отправляет результат в специальную функцию.
(Я думал о sprintf, поскольку на большинстве платформ он работает так же, как printf).
Моя идея заключалась в том, чтобы написать небольшой макрос, который сделал это:
#define my_printf(X, Y...) do{ printf(X, ## Y); \
char* data = malloc(strlen(X)*sizeof(char)); \
sprintf(data, X, ## Y); \
other_print(data);\
free(data);}while(0)
Но поскольку sprintf может расширять строку до гораздо большего размера, чем X,
этот метод ломается почти напрямую.
И если просто добавить число, то malloc кажется неправильным способом решения проблемы,
с тех пор я просто перенесу проблему в будущее и в тот день, когда я захочу напечатать большое выражение ...
Кто-нибудь имеет лучшее представление о том, как решить эту проблему?
Или как я узнаю, насколько большим будет результат sprintf?
Спасибо
Johan
Обновление: Я забыл, что printf возвращает количество напечатанных символов,
и так как я уже вызываю printf в макросе, было очень легко добавить
int, который сохраняет номер.
#define buf_printf(X, Y...) do{ int len = printf(X, ## Y); \
char* data = malloc((len+1)*sizeof(char)); \
sprintf(data, X, ## Y); \
other_print(data);\
free(data);}while(0)
Обновление: Я думал об этом и, возможно, использовать обычную функцию
это очень похоже на то, что предложил эфимент, это хорошая идея.
Ключ, кажется, v-версия различных функций printf
(vprintf, vsprintf и vsnprintf). Спасибо за указание на это.
Еще раз спасибо
Johan