gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:02:15 24 4
gpt4 key购买 nike

我想要制作 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 没有函数指针呢?

最佳答案

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

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

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

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

关于用于扫描和打印任何基本数据类型数组的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41117642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com