我想制作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没有函数指针?
答案 0 :(得分:1)
实际上,它对int
有一些错误。
尝试输入127 128 255
,它应该返回127 -128 -1
。
问题是char *element, *end;
,然后用*element
取消引用,它只读取8位,而不是double
的整个32位。
对于这种情况,我认为定义一个宏是一个更好的选择,或者你需要在c中为qsort
提供函数指针。