这是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