C用于扫描和打印任何基本数据类型数组

时间:2016-12-13 09:33:47

标签: c arrays pointers

我想制作scan_array和print_array函数,可以扫描和打印从stdin到stdout的任何基本数据类型数组。

到目前为止我得到了什么:

#include<stdio.h>
void scan_array(void* base, size_t size_of_one, size_t n, const char* fmt)
{
    char *element, *end;
    end = (char *)base + size_of_one * n; 
    for (element = (char *)base; element < end; element += size_of_one) {
        scanf(fmt, element);
    }
}

void print_array(void* base, size_t size_of_one, size_t n, const char* fmt) 
{
    char *element, *end;
    end = (char *)base + size_of_one * n; 
    for (element = (char *)base; element < end; element += size_of_one) {
        printf(fmt, *element);
    }
}
int main()
{
    double a[3];
    size_t n = 3;
    scan_array(a, sizeof(double), n, "%lf");

    int i;
    for(i=0; i<n;i++) {
        printf("%lf ", a[i]);
    }

    putchar('\n');

    // prints zeros
    print_array(a, sizeof(double), n, "%lf ");
    return 0;
}

scan_array函数适用于所有基本类型,我在main中检查了正常for循环。

print_array函数适用于INTS,但不适用于任何其他基本数据类型。

首先想到的是更改print_array def,以便它接受函数指针而不是像这样的const char * fmt

void print_array(void* base, size_t size_of_one, size_t n, void (*data_printer)(void *el))
{
    char *element, *end;
    end = (char *)base + size_of_one * n; 
    for (element = (char*)base; element < end; element += size_of_one) {
        data_printer(element);
    }
}

而不是制作double_printer:

void double_printer(void *el) 
{
    printf("%lf ", * (double *) el);
}

它完美无缺。

print_array(a, sizeof(double), n, &double_printer);

但有没有办法让print_array没有函数指针?

1 个答案:

答案 0 :(得分:1)

实际上,它对int有一些错误。

尝试输入127 128 255,它应该返回127 -128 -1

问题是char *element, *end;,然后用*element取消引用,它只读取8位,而不是double的整个32位。

对于这种情况,我认为定义一个宏是一个更好的选择,或者你需要在c中为qsort提供函数指针。