2014-01-29 74 views
1

你如何做到这一点:在C中写printf等价于什么?

printf("I would like %d tomatoes", numTomatoes); 

有:

write(STDOUT, "HOW?", 4); 

是否有某种类型的预处理,使得它所有的字符数组,然后我能找到的长度,并打印出来?

上下文:我需要在信号处理程序中使用write而不是printf。

回答

6

要获得格式化的字符串,您可以使用sprintf/snprintf;

char buffer[0x1000]; 
size_t length = snprintf(buffer, sizeof(buffer), "I would like %d tomatoes", numTomatoes); 
write(STDOUT_FILENO, buffer, length); 

编辑:如果你是大缓冲区大小困扰,那么你可以(在现代C99)执行以下操作首先要确定必要的缓冲区大小:

size_t length = snprintf(NULL, 0, "I would like %d tomatoes", numTomatoes); 
char buffer[length]; 
snprintf(buffer, length, "I would like %d tomatoes", numTomatoes); 
write(STDOUT_FILENO, buffer, length); 
+0

对于信号处理程序, 'char buffer [0x1000]'看起来很大。 – chux

+0

如果字符串超过缓冲区大小,有什么办法检查?就像@chux说的那样,即使在当今的计算中1000个字符相对较小,它是否会在任何时候使用太多。 – donkon

+0

@donkon如果sizeof(buffer)大于'snprintf'已截断输出,则可以检查'length'大小。第二个参数确保它不会超出缓冲区。此时你知道输出将会有多长时间,你可以分配一个更大的缓冲区并再次调用'snprintf'。 –

相关问题