【问题标题】:lexicographic compare with unknown bytes size - in c字典比较与未知字节大小 - 在c中
【发布时间】:2011-12-07 23:46:25
【问题描述】:

如何在两个字节大小未知的指针之间进行字典比较, 假设两个数组大小相等, 例如实现以下函数以根据比较返回 -1 或 0 或 1 并将每个字节转换为 ascii

compare(const void *p1, const void *p2, int size)

编辑:我添加了另一个要比较的字节大小的参数,我如何将每个字节转换为 char 并在它们之间进行比较?

【问题讨论】:

  • 数组大小未知?这将如何运作?
  • 没有数组大小是不可能的?
  • 你需要知道要比较多少个数组元素
  • 如果我要添加计数参数,我该如何实现它?

标签: c


【解决方案1】:

您可能正在寻找strcmp(3) 函数。

更新

如果您的数组不是 ASCII 字符串,并且可能在任何位置包含 0x00 字节而实际上没有任何意义,那么您将需要 Oli 指出的长度,因此您可以使用 memcmp(3) 函数:

int memcmp(const void *s1, const void *s2, size_t n);

更新 #2

好的,既然我们已经确定您想要不同的字节,那么您将需要自己的函数。像这样的东西(未经测试):

size_t cmp(const unsigned char *c1, const unsigned char *c2, ssize_t n) {
    ssize_t i;
    for (i=0; i<n; i++) {
        if (c1[i] != c2[i])
            return i;
    }
    -1;
}

这将让您找到不同字节的字节值。请注意-1 返回,以防没有区别。这限制了您比较大小完全适合 ssize_t 的对象,该类型小于 size_t 类型——但由于您要比较其中两个,我认为每个对象最多只能获得一半的进程地址空间.

【讨论】:

  • 没错,但他确实提到了“ascii”,这让我有勇气发布答案。 :)
  • 也许你应该看看 Oli 关于自己遍历数组的建议——s1[i] 仅在你知道数组的 type 时才有意义,而 const void * 不知道'不要告诉编译器每个元素的大小是多少。 (内部将每个数组视为n 字节长,但您不能在不执行强制转换的情况下取消引用无类型数组...)也许用您要解决的任务重新编辑您的问题?
  • @sarnold 好的,现在有意义了吗?
  • 抱歉,不是真的——memcmp(a,b,n) 将根据字典排序返回负数或正数,具体取决于哪个“大于”或“小于”——或者两者是否相等,它将返回0。如果您想知道哪个特定字节不同,那么您必须编写一个循环来为您完成工作。它可能不如memcmp(3) 快,但它让您找出哪些字节不同(如果有)。
  • @Shlomi Komemi 可以将 void 指针转换为任何其他指针。只需执行char *c1 = p1, *c2 = p2; 并比较它们的值,例如if(*c1 &lt; *c2 )
【解决方案2】:

您需要某种方式来了解大小。显式(例如,在数据中使用 size 参数或字段)或隐式(例如,使用空终止符)。

【讨论】:

  • @ShlomiKomemi:通过遍历数组直到一个与另一个不同,或者直到你到达终点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
相关资源
最近更新 更多