2014-10-10 4 views
0

Есть ли функция типа printf, которая может возвращать строку вместо ее печати? У меня есть функция, которая печатает строку в определенном цвете, но она должна быть строковым литералом вместо принятия переменных, таких как printf.printf Что возвращает строку

// Function declaration (Assums YELLOW and NORMAL are the unix constants for terminal colors 
void pYellow(char *str) { 
    printf("%s%s%s", YELLOW, str, NORMAL); 
} 

//Function call 
void pYellow("This is a string"); 

Если я хотел напечатать цвет с переменной, он не будет работать. Например, pYellow("Num: %d", 42); даст ошибку, потому что у нее слишком много параметров. И делать pYellow(printf("String")); тоже не получится.

TL: DR Я хочу знать, есть ли метод printf, который возвращает строку вместо ее печати.

+1

Вы можете использовать snprintf, как предложено 'dom0', или вы можете использовать функцию, которая динамически распределяет память и возвращает указатель. Существует нестандартный, называемый 'asprintf', однако вы можете реализовать это в стандарте C в нескольких строках, делегируя' vsnprintf'. –

+0

http://en.cppreference.com/w/cpp/io/c/fprintf –

+0

См. Также [Заменить или обходной путь для 'asprintf()' в AIX] (http://stackoverflow.com/questions/4899221/substitute -или-обходной путь-к-asprintf-на-Экс). –

ответ

2

Применение snprintf:

int snprintf(char *str, size_t size, const char *format, ...); 
  • str представляет собой буфер вы выделены (например, malloc())
  • size является размер этого буфера
  • После вызова форматированная строка хранится в str.
  • Там также sprintf, никогда не использовать его

Также вы можете создать собственный printf -как функции, используя v*printf семейство функций. Самый простой пример для этого:

#include <stdarg.h> 
// required for va_list, va_start, va_end 

void customPrintf(const char* format, /* additional arguments go here */ ...) 
{ 
    va_list args; 
    va_start(args, format); 
    // set color here (for example) 
    vprintf(format, args); 
    // reset color 
    va_end(args); 
} 
+0

Не согласен с «' sprintf', никогда не используйте его ». 'snprintf()' также имеет свой собственный набор проблем. Используйте правильный инструмент для задания и используйте его правильно. Нет ничего опасного в отношении 'char [sizeof (int) * CHAR_BIT/3 + 3]; sprintf (buf, "% d", some_int); 'если кодер не может правильно использовать' sprintf() ', вероятность использования' snprintf() 'правильно не намного выше и обеспечивает ложное ощущение безопасности. Как и рекомендация 'strncpy()' over 'strcpy()' - торговля одним набором проблем для другого. – chux

+0

@chux Я по-прежнему предпочитаю версию snprintf для '% d', вы * знаете *, это не будет переполнение буфера, тогда как с другим вы должны задействовать свой мозг, чтобы проверить его (и даже тогда вам может быть не 100 % конечно). –

+0

@Matt McNabb Согласен 'snprintf()' предотвращает переполнение буфера. Если буфер недостаточен, напечатанные результаты ошибочны (усечены). Код все еще имеет проблему. Мы продали один тип проблем для другого. Это лучше, но в конце концов, надежный код должен 1) предотвратить ('sprintf()' route) или 2) справиться с усечением ('snprintf()' route). IAC - моя точка зрения заключается в том, что это не то, что всегда есть _better_, но объявление «sprintf» никогда не используется »не является хорошим советом из-за« никогда ». – chux

Смежные вопросы