如何正确地将 C 中任何类型的数据与指针进行比较并将类型转换为 char

乔恩

我知道 C 不是一种容易让开发人员创建泛型类型函数的语言。但是,作为一个学习练习,我正在尝试编写一个函数,该函数允许用户传递任何数据类型(即)的数组和任何数据类型(即void)的标量void该函数的目的是用指针遍历数组并将标量与数组索引中的值进行比较,看看它们是否匹配。为此,我将标量和数组转换为 acharstrcmpstring.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将为零,因此它将作为字符串终止符工作,并且您的代码似乎可以正常工作。

另一方面,该float3.1将表示为0x40466666(根据IEEE-754 浮点转换器)。这不包含 0x00 字节,因此strcmp()看起来工作的机会较小。


的类型compare应该是int,不是charstrcmp()memcmp()返回int且未指定其范围。(只是根据比较的结果指定为正数、负数或零)。因此,由于截断,可能会有一些机会将 unmatch 误解为 match。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何正确地将字符串转换为 url?C#

如何正确地将返回的JSON转换为C#类?

如何正确地将 Rust 字符串转换为 C 字符串?

在C ++中正确地将`void *`转换为整数

如何正确地将int类型的算术运算结果存储为C ++中的double类型和不同类型?

(C) 我是否正确地将枚举类型转换为字符串?

如何正确地将 _foo 转换为 `Foo` 类型?

如何在标准 C 中正确地将双指针(指向指针的指针)用于结构数组?

调用旧版C API时,如何在现代C ++中正确地将指向结构的指针转换为指向其他结构的指针?

我是否正确地从“const char *”转换为“TCHAR*”?

如何正确地引用作为地址传递给函数的char **指针?

如何正确地将字符串中的转义符转义以在C中获得JSON兼容格式?

如何正确地将PHP和CURL帖子正确转换为groupon API的C#HTTP客户端帖子

正确地将C ++ long转换为C#int

如何正确地将std :: string与“”进行比较?

如何正确地将C算法与OpenMP并行化?

如何正确地将C与Delphi静态链接?

如何正确地将String转换为ArrayList?

如何正确地将uuid转换为BINARY(16)?

如何正确地将DateTime转换为特定的TimeZone?

如何正确地将SQL行转换为列?

如何正确地将年月转换为年季

我无法在 C# 中正确地将字符串转换为 Int

如何正确地将 blob 数据插入表中

C shell 中的错误。不兼容的整数到指针转换将“char”传递给“char **”类型的参数

如何正确地将功能填充到std中?

如何正确地将染料设置到ItemStack中?

如何正确地将 JavaScript 合并到 html 中?

如何正确地将对象按类型从C#传递到VBScript?