我有一个大小为N的char数组,如果vsnprintf的长度超过char数组大小减1(N-1字节),我需要在不同的部分获取它的输出。
我想实现类似printf的东西,但是要通过UART输出它我不想N大于100如果有人想打印超过100个字符的字符串,我想分部分打印我用过vsnprintf,但我不知道如何一部分一部分地得到它的输出也许这不是stdio库的正确功能,我也查看了vsnprintf和vscprintf,但是,我仍然不知道如何实现我想要的。
我不想调用MALOC,我不想使用VLA,因为我希望最大缓冲区长度为100,但同时能够部分地输出一个长度大于100字节的字符串。
char char_array[100];
void uart_print(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
vsnprintf(char_array, sizeof(char_array), fmt, args); /* Don't get the result because it is not useful for me */
uart_output(char_array);
}
实际结果是通过UART以100字节的速度输出字符串我想要完整的字符串输出。
我想这样做:
char char_array[100];
void uart_print(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
int ret;
unsigned int start_index = 0;
size_t max_s = sizeof(char_array);
do {
ret = vsnprintf(char_array, max_s, start_index, fmt, args); /* The new parameter is number 3, it would specify from which point from the generated string it starts to save data in char_array */
uart_output(char_array);
start_index += max_s;
} while (max_s <= ret);
}
最佳答案
您可以使用fopencookie为流输出注入您自己的输出函数。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdarg.h>
#define CHUNK_SZ 2
void uart_output(const char *buf, int size )
{
fwrite( buf,1,size,stdout );
putchar(10);
}
ssize_t cf_write(void *cookie, const char *buf, size_t size)
{
while( size > CHUNK_SZ ) {
uart_output(buf, CHUNK_SZ );
size -= CHUNK_SZ;
buf += CHUNK_SZ;
}
if( size ) uart_output(buf, size );
return size;
}
static cookie_io_functions_t cf = { write: cf_write };
void uart_print(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
FILE *fp = fopencookie(NULL, "w", cf );
vfprintf( fp, fmt, args );
fclose(fp);
va_end(args);
}
int main(int argc, char **argv)
{
uart_print( "hello world %s", "test" );
}
关于c - 逐步获取vsnprintf()输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56986287/