【问题标题】:Char* and byte* equality comparison (numbers and text)Char* 和 byte* 相等比较(数字和文本)
【发布时间】:2013-02-05 05:10:24
【问题描述】:

我有以下一个 char* 键,它是一个可以包含整数或文本的 char 数组。所以键可以有值 3 或 tom 例如

我有一个包含存储数据的 byte* 数据数组。我需要测试密钥是否等于数据。

我的逻辑目前是这样的:

int j = 0 ;
for (j = 0; j < len; j++) {
    sprintf(key_cmp, "%02x", (ulong)*data++);
}
if (!strcmp(key, key_cmp)) fprintf(stderr, "Equal \n");

我意识到这段代码不正确,因为我在这里尝试打印为十六进制而不是字符...但是当我尝试使用 %02x 时,会打印出垃圾。

如何确保 01 和 1 被视为平等?我意识到这可能因字节顺序而异,因此我想不出一个通用的解决方案。我想避免使用 atoi 所以想知道是否有另一种方法(主要是因为我没有真正的方法知道密钥是否为整数)

谢谢

【问题讨论】:

  • 我知道这可能看起来有点矫枉过正,但是您是否考虑过将一个转换为另一个,然后只做一个memcmp() 或一个strcmp() 最终这就是您现在所做的一切,只有一个一个字节。如果您尝试多用途输入,那么您将面临漫长的挫折之路。为此,找到那个决定“但字符串和数字实际上只是字节,所以它们非常相似”的架构宇航员,然后拔掉他的氧气。
  • “可以包含整数或文本的 char 数组” - 准确了解您正在处理的数据类型非常重要。
  • 这是未键入的存储引擎的一部分。因此这是无法实现的。
  • 听起来你最好将你的字符串转换成数字并比较数字。
  • 既然您处于一个非常具体的情况,为什么不尝试自己实施呢?字符串 -> 整数,如果字符串包含非数字字符,则有一个备用值,不是很复杂。

标签: c string char type-conversion


【解决方案1】:

猜测是您的问题是%02xint 而不是unsigned long 的格式 - 所以您在sizeof(int)!=sizeof(long) 的系统上会导致问题。

有关格式说明符的说明,请参阅 [Wiki][1]。

【讨论】:

    【解决方案2】:

    因为 char[] 是 1 个字节,而 byte[] 是 1 个字节,所以将它们作为字节数组(无符号字符)进行比较会更容易。没有任何特殊格式,两者都会做同样的事情。

    memcmp(key,data,len)
    strcmp(key,data,len)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 2014-12-21
      • 2021-12-06
      相关资源
      最近更新 更多