如何在不使用sprintf的情况下在C中连接字符串和整数?

我正在为嵌入式系统编写以下代码,其中将字符串和整数放入缓冲区。代码中有几个sprintf与下面的类似(具有多个字符串和整数)。

sprintf(txbuf,"info=>t:%d-%d-%d$%d:%d:%d",ui8Day,ui8Month,ui8Year,ui8Hour,ui8Minute,ui8Second);

PS:$-:仅用于数据分离。

但是,sprintf占用的内存很大,我正在尝试减小代码大小。我还尝试使用strcatstrcpy函数,但它们最终也增加了代码大小。

anyang394375278 回答:如何在不使用sprintf的情况下在C中连接字符串和整数?

这是sprintf的简约实现,您可以用作仅支持%d%u%x%s,{{1 }}和%c。您可以轻松地对其进行修改,以删除未使用的转化说明符:

%%

但是请注意,您的示例可能应使用#include <limits.h> #include <stdarg.h> #include <stdio.h> int small_sprintf(char *dest,const char *fmt,...) { char buf[20]; va_list arg; char *p,*s; int n; unsigned int u; va_start(arg,fmt); for (p = dest; (*p++ = *fmt++) != '\0';) { if (fmt[-1] == '%' && *fmt != '\0') { p--; s = buf + sizeof(buf); *--s = '\0'; switch (*fmt++) { case 'u': u = va_arg(arg,unsigned); goto conv10; case 'd': u = n = va_arg(arg,int); if (n < 0) { *p++ = '-'; u = -u; } conv10: do { *--s = '0' + (u % 10); } while ((u /= 10) != 0); break; case 'x': u = va_arg(arg,unsigned); do { *--s = "0123456789abcdef"[u & 15]; } while ((u >>= 4) != 0); break; case 's': s = va_arg(arg,char *); break; case 'c': *--s = (char)va_arg(arg,int); break; default: *--s = fmt[-1]; break; } while ((*p = *s++) != '\0') p++; } } va_end(arg); return p - 1 - dest; } int main() { char buf[128]; int n = small_sprintf(buf,"Hello %s%c %d %d%% INT_MIN=%d,INT_MAX=%x","world",'!',100,INT_MIN,INT_MAX); puts(buf); while (n-- > 0) putchar('-'); putchar('\n'); return 0; } %02d来生成%.2d而不是01几分钟和几秒钟。为此,您可以使用以下代码添加另一个转化说明符1

%D
,

您可以使用snprintf()而不是sprintf(),因为snprintf()可以阻止内存溢出。

本文链接:https://www.f2er.com/2627889.html

大家都在问