C打印通用类型向量

时间:2018-11-10 10:06:12

标签: c vector printf

嗨,我正在尝试创建一个将void *指针作为参数的函数,并使用printf打印矢量的所有元素

该函数的声明为:

void print_vec(void *vec,int dime_se,int dime,char *format);

,实现为:

void print_vec(void *vec,int dime_se,int dime,char *format){
    for(int i=0;i<dime;i++)
        printf(format,*(vec+dime_se*i));
}

问题是当我编译时,编译器返回:

error: invalid use of void expression printf(format,*(vec+dime_se*i));

那么问题是有一种方法可以完成此任务而无需做到这一点?

void print_vec(void *vec,int dime_se,int dime,char *format){
for(int i=0;i<dime;i++)
    switch(format[1]){
        case 'c':
            printf(format,*((char*)(vec+dime_se*i)));
            break;

        case 'd':
            printf(format,*((unsigned int*)(vec+dime_se*i)));
            break;


        case 's':
            printf(format,*((char**)(vec+dime_se*i)));
            break;

        case 'i':
            printf(format,*((int*)(vec+dime_se*i)));
            break;



        case 'f':
            printf(format,*((float*)(vec+dime_se*i)));
            break;

        default:
            break;
    }

}

1 个答案:

答案 0 :(得分:4)

您不需要dime_se参数。大小或多或少地隐含在格式字符中。 另外,如果强制转换为正确的指针类型,则可以让C进行缩放而不是进行缩放 手动:

#include <stddef.h>
#include <stdio.h>
void print_vec(void const*vec,size_t dime,char const*format)
{
    for(size_t i=0;i<dime;i++)
        switch(format[1]){
            #define X(Char,Tp) break;case Char: printf(format,((Tp*)vec)[i])
            X('c',char);
            X('d',unsigned);
            X('s',char*);
            X('i',int);
            X('f',float);
            break;default: return;
            #undef X
        }
}

我之所以说得差不多,是因为类型提升有点使线条模糊。 %f很可能意味着您拥有double而不是float

如果您想使用dime_se参数消除这种情况的歧义,则可以:

         break;case 'f': 
                if(sizeof(double)==dime_se)
                     printf(format,((double*)vec)[i]);
                else { 
                     assert(sizeof(float)==dime_se); 
                     printf(format,((float*)vec)[i]); 
                }

但是我不确定像这样的print_vec函数是否是个好主意。