2014-10-10 52 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

您可以使用'dom0'建议的snprintf,或者您可以使用一个动态分配内存并返回一个指针的函数。有一种叫做'asprintf'的非标准格式,但是你可以通过委托给'vsnprintf'在几行中用标准C实现它。 – 2014-10-10 02:07:12

+0

http://en.cppreference.com/w/cpp/io/c/fprintf – 2014-10-10 02:09:11

+0

另请参见[AIX上'asprintf()'的替代或替代方法](http://stackoverflow.com/questions/4899221/substitute - 或解决方法换asprintf-ON-AIX)。 – 2014-10-10 18:29:26

回答

2

使用snprintf

int snprintf(char *str, size_t size, const char *format, ...); 
  • str是你分配的缓冲区(例如malloc()
  • size是缓冲
  • 大小的格式化字符串存储在str呼叫后。
  • 还有sprintf从来没有使用它

您也可以创建自己的使用v*printf家庭的功能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()'的机会不会太高,并且会带来虚假的安全感。就像通过'strcpy()'推荐'strncpy()'一样 - 将一组问题交换为另一组问题。 – chux 2014-10-10 02:03:49

+0

@chux我仍然更喜欢'%d'的snprintf版本,你知道它不会缓冲溢出,而另一个你必须用你的大脑来检查它(即使你不是100 %肯定)。 – 2014-10-10 02:08:33

+0

@Matt McNabb同意'snprintf()'可以防止缓冲区溢出。如果缓冲区不足,打印结果是错误的(截断)。代码仍然有问题。我们已经为另一种交易了一种类型的问题。有争议的是哪个更好,但最终,可靠代码需要1)防止('sprintf()'route)或2)应付截断('snprintf()'route)。 IAC - 我的观点是,它并不总是_better_,但是声明“'sprintf',从不使用它”并不是好建议,因为“从不”。 – chux 2014-10-10 02:58:44