我知道 C 不是一种容易让开发人员创建泛型类型函数的语言。但是,作为一个学习练习,我正在尝试编写一个函数,该函数允许用户传递任何数据类型(即)的数组和任何数据类型(即void
)的标量void
。该函数的目的是用指针遍历数组并将标量与数组索引中的值进行比较,看看它们是否匹配。为此,我将标量和数组转换为 achar
并strcmp
从string.h
库中使用。该函数类似于下面的示例。
void find_vector_indices(void *vec, void *value, size_t num_bytes, size_t arr_size) {
char compare;
char *val = (char *) value;
char *dst;
for (int i = 0; i < arr_size; i++) {
dst = (char *) vec + (i * num_bytes);
compare = strcmp(dst, val);
if (compare == 0) printf("Strings Match\n");
}
}
在主函数中,如果我有以下使用整数的代码,则上述函数可以正常工作并打印Strings Match
两次,正如我所期望的那样。
int a[3] = {3, 2, 3};
int b = 3;
find_vector_indices(a, &b, sizeof(int), 3);
但是,如果我将主函数修改为浮点数组和浮点标量,则该函数不再起作用。
float a[3] = {3.1, 2.2, 3.1};
flat b = 3.1;
find_vector_indices(a, &b, sizeof(float), 3);
我假设这与浮点和整数值在内存中的表示方式有关。但是,据我所知,它们都消耗 4 个字节的内存,并且应该正确地表示为字符串,我相信在这个函数的指针算法中正确地指出了它。解决方案可能很简单,但它正在逃避我。任何帮助,将不胜感激。
strcmp()
用于比较字符串(以 NUL 结尾的字符序列),而不是任意二进制数据。改为使用memcmp()
。
代替
compare = strcmp(dst, val);
你应该使用
compare = memcmp(dst, val, num_bytes);
在 little-endian 机器中,小字节(例如 2 或 3)的第 2、第 3 和第 4 个字节int
将为零,因此它将作为字符串终止符工作,并且您的代码似乎可以正常工作。
另一方面,该float
值3.1
将表示为0x40466666
(根据IEEE-754 浮点转换器)。这不包含 0x00 字节,因此strcmp()
看起来工作的机会较小。
的类型compare
应该是int
,不是char
。strcmp()
并memcmp()
返回int
且未指定其范围。(只是根据比较的结果指定为正数、负数或零)。因此,由于截断,可能会有一些机会将 unmatch 误解为 match。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句