当前位置:  开发笔记 > IOS > 正文

变量函数和va_arg:变量化要打印的类型

如何解决《变量函数和va_arg:变量化要打印的类型》经验,为你挑选了1个好方法。

我试图重新编码一个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函数中插入我的变量吗?



1> John Bolling..:

C是静态类型的.所有数据类型都在编译时确定.您无法通过调用函数来获取声明的数据类型.

相反,要处理其类型在运行时才知道的可变参数,必须通过switch语句或if/ else if/ elsenest 基于所选数据类型进行分支.在每个替代方案中,使用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是类型本身,而不是它的字符串表示.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有