在嵌入式编程中,我经常会得到如下所示的代码:
void debug_terminal_printf(const char* format, va_list ap){
char tmp[ARBITRARY_LIMITATION];
vsprintf( tmp, format, ap );
for(int pos=0; pos<strlen(tmp); pos++){
if( tmp[pos] == 0 ) break;
uart_putc( tmp[pos] );
}
}
我希望我的界面提供字符串格式的便利,但格式化字符串的使用者通常是一次消耗格式化字符串几个字节的东西,例如本例中的 UART。所以我在我的每个辅助函数中都得到了这些小的临时缓冲区。使用动态内存并不合适,因为有关动态内存使用的决定是在系统级别做出的,在嵌入式平台代码中使用它是不合适的。
我希望能够做的是逐步处理字符串,如下所示:
void debug_terminal_printf(const char* format, va_list ap){
char tmp[MAX_TOKEN_SIZE];
while(*format){
int len = single_token_sprintf( tmp, format, ap );
uart_puts(tmp);
format += len;
}
}
这样我就不需要足够的内存来存储整个格式化字符串,我可以等到硬件消耗完最后一个 token 后再继续解码下一个 token 。
有没有人见过像这样的(希望是可移植的)习惯用法,它摆脱了对大型临时缓冲区的需要?
最佳答案
非常感谢@chux 指导我正确的方向。
答案是可以 Hook 运行时环境的 putc() 实现,以便在调用 fprintf 时,我可以一次一个字节地使用结果字符串。这是非常不可携带的。对于每个环境,实现此目的的确切方法会有所不同。
就我而言(Keil 上的 Cortex M),Keil 在这里提供了说明: http://www.keil.com/support/man/docs/gsac/gsac_retargetcortex.htm
关于c - 有没有办法在 C 中增量处理格式说明符字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39625316/