【发布时间】:2014-12-14 23:51:03
【问题描述】:
我想逐步解释如何解析可变参数函数的参数 这样当调用 va_arg(ap, TYPE);我传递了正在传递的参数的正确数据类型。
目前我正在尝试编写 printf 代码。 我只是寻找解释,最好用简单的例子,但不是 printf 的解决方案,因为我想自己解决这个个人挑战以取得进步。
Link1、link2 和 link3 是我认为是我正在寻找的示例的一部分。 我了解 typedef、struct、enum 和 union 的基本功能,但无法弄清楚链接中的示例等实际应用案例。
它们的真正含义是什么?我无法想象它们是如何工作的。 如何像链接示例中那样将数据类型从联合传递到 va_arg ?它是如何匹配的? 使用 %d、%i ... 之类的修饰符或参数的数据类型?
这是我目前得到的:
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include "my.h"
typedef struct s_flist
{
char c;
(*f)();
} t_flist;
int my_printf(char *format, ...)
{
va_list ap;
int i;
int j;
int result;
int arg_count;
char *cur_arg = format;
char *types;
t_flist flist[] =
{
{ 's', &my_putstr },
{ 'i', &my_put_nbr },
{ 'd', &my_put_nbr }
};
i = 0;
result = 0;
types = (char*)malloc( sizeof(*format) * (my_strlen(format) / 2 + 1) );
fparser(types, format);
arg_count = my_strlen(types);
while (format[i])
{
if (format[i] == '%' && format[i + 1])
{
i++;
if (format[i] == '%')
result += my_putchar(format[i]);
else
{
j = 0;
va_start(ap, format);
while (flist[j].c)
{
if (format[i] == flist[j].c)
result += flist[i].f(va_arg(ap, flist[i].DATA_TYPE??));
j++;
}
}
}
result += my_putchar(format[i]);
i++;
}
va_end(ap);
return (result);
}
char *fparser(char *types, char *str)
{
int i;
int j;
i = 0;
j = 0;
while (str[i])
{
if (str[i] == '%' && str[i + 1] &&
str[i + 1] != '%' && str[i + 1] != ' ')
{
i++;
types[j] = str[i];
j++;
}
i++;
}
types[j] = '\0';
return (types);
}
【问题讨论】:
-
是的 ft_printf