我试图重新编码一个printf
函数,所以我需要使用,va_arg
因为printf
是一个可变函数.
问题是,当我想打印出参数时my_printf
,如果我们采用这两种基本可能性,它们可以是%i
(int
)或%s
(char *
).
因此,当我浏览我的时候va_list ap
,我试图在va_arg
函数中添加一个变量,以便我可以更改要写入的类型,如下所示:
char *str = NULL; str = ft_set_my_types(flags[cur_arg]); ft_putstr(va_arg(ap, str));
我的功能ft_set_my_types
是这样的:
char *ft_set_my_types(char *flags) { char **tab = NULL; tab = ft_alloc_mem2(2, 15); /* this function malloc a tab */ char a = 65; /* the example here is only with two types of variables */ /* I am sending flags %s in my example which correspond to "char *" */ tab['s'] = "char *"; tab['d'] = "int "; size_t len = ft_strlen(flags) - 1; while (a < 123) { if (a == flags[len]) break ; else a++; } return (tab[a]); }
"char*flags"是"%"和标志(包含)之间的所有内容my_printf
.
问题是:当我编译它不理解我的选项卡['s'],char *
但作为"char*"所以我得到这个错误:
ft_print.c:63:25: error: unknown type name 'str' ft_putstr(va_arg(ap, str)); ^ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include/stdarg.h:35:50: note: expanded from macro 'va_arg' #define va_arg(ap, type) __builtin_va_arg(ap, type) 1 error generated.
你能帮我弄清楚如何*str
在这个va_arg
函数中插入我的变量吗?
C是静态类型的.所有数据类型都在编译时确定.您无法通过调用函数来获取声明的数据类型.
相反,要处理其类型在运行时才知道的可变参数,必须通过switch
语句或if
/ else if
/ else
nest 基于所选数据类型进行分支.在每个替代方案中,使用va_arg
宏来获取参数,并使用该替代方法处理适当的静态类型.如果您愿意,您可以在辅助函数中执行特定于类型的处理.
例如,
/* ... */ switch (field_code) { case 'i': do_something_with_int(va_arg(ap, int)); break; case 's': do_something_with_string(va_arg(ap, char *)); break; default: handle_error(); break; } /* ... */
请注意,第二个参数va_arg
是类型本身,而不是它的字符串表示.