gpt4 book ai didi

c - 逐个获取 vsnprintf() 输出

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:06 28 4
gpt4 key购买 nike

我有一个大小为 N 的 char 数组,我需要在不同部分获取 vsnprintf 输出,以防其长度超过 char 数组大小减去 1(N-1 字节)。

我想实现类似 printf 的东西,但通过 UART 输出它。我不希望 N 大于 100。如果有人想要打印超过 100 个字符的字符串,我想分段打印。我使用过 vsnprintf 但我不知道如何逐个获取它的输出。也许它不是 stdio 库中使用的正确函数,我也查看了 vsnprintf_s 和 _vscprintf 但仍然不知道如何实现我想做的事情。我不想调用malloc,我也不想使用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注入(inject)自己的输出函数进行流输出。

   #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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com