我有一个大小为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/

10-12 14:52
查看更多