#include <stdio.h>
#include <stdarg.h>
#include <string.h>
int compare_long_format(const char *sub_fmt, const char *fmt)
{
return !strncmp(sub_fmt, fmt, 2);
}
int compare_classic_format(const char *sub_fmt, const char c)
{
return (*sub_fmt == c);
}
void my_func(const char *s,...)
{
char *p, *prev = (char *)s;
char *peer, *i;
int for_int = -1;
double for_double = 0.0;
int skip = 0;
va_list v;
va_start(v, s);
while(1)
{
p = strchr(prev, '%');
if(!p)
{
if((*prev))
printf("%s\n", prev);
break;
}
if(prev != p)
{
for(i = prev; i < p; i++)
printf("%c", *i);
}
peer = ++p;//skip '%'
if(compare_classic_format(peer, 'd') ||
compare_classic_format(peer, 'c') || compare_classic_format(peer, 'h'))
{
skip = 1;
for_int = va_arg(v, int);
printf("%d", for_int);
}
else if (compare_long_format(peer, "ld"))
{
skip = 2;
for_int = va_arg(v, int);
printf("%d", for_int);
}
else if(compare_classic_format(peer, 'f') )
{
skip = 1;
for_double = va_arg(v, double);
printf("%lf", for_double);
}
else if(compare_long_format(peer, "lf"))
{
skip = 2;
for_double = va_arg(v, double);
printf("%lf", for_double);
}
else
{
printf("not support \%%c", *peer);
return;
}
prev = peer + skip;
}
va_end(v);
}
int main()
{
my_func("%d %fxx\n", 36, 100.0);
my_func("%c %lf\n",37, 1000.0);
my_func("\nzhang %c san zhao si %c __lei %d feng %lf201412xxxx\n", 97,99, 200, 2014.12);
return 0;
}
实现可变参数函数字符串的格式简单解析样例
最新推荐文章于 2023-08-20 00:01:55 发布