比较包含数字的字符串时出现问题

3

你好,我遇到了一个问题,需要比较两个包含数字的char*变量,例如char1 = "999999"char2="11111111"。当我使用strcmp函数时,它会返回char1变量大于char2,即使这是错误的。(我知道可以使用atoi函数在字符串中比较9个字符,但我需要使用10个字符,所以无法采用该方法)。

6个回答

4

一种稍微繁琐的方法,避免使用atoi等函数,是在较短的字符串前加上零。或者,假设没有前导零,可以先比较长度(因为较短的字符串必须有较低的值),然后进行字典序比较:

int numerical_strcmp(const char* a, const char* b) {
    return (strlen(a) != strlen(b)) ? ((strlen(a) > strlen(b)) ? 1 : -1) : strcmp(a, b);
}

哦,这需要字符串包含非负数。


1
你应该将 strlen() 的结果缓存到一个变量中。 - Dummy00001
1
顺便说一下,我经常这样做 int x = (strlen(a) - strlen(b)); 以节省一个变量。 - Dummy00001

4

实际上,它是正确的。它对字符串内容进行字符串比较,而不是数字比较。

作为一种快速且简单的解决方法,假设您已经验证了字符串包含正整数,您可以执行以下操作:

if (strlen(char2) > strlen(char1)) {
  // char2 > char1
} else if (strlen(char2) == strlen(char1)) {
  cmp = strcmp(char2, char1);
  if (cmp > 0) {
    // char2 > char 1
  } else if (cmp == 0) {
    // char2 == char1
  } else {
    // char2 < char1
  }
} else {
  // char2 < char1
}

有没有一种方法可以根据字符串的数值进行比较? 因为这正是我需要进行比较的内容。 - Nadav
是的 - 请参考上面的内容。如果一个字符串比另一个长或短,那么这就决定了答案;如果它们长度相同,则可以使用strcmp()函数。 - David Knell

3
如果字符串没有前导/尾随垃圾,请使用以下算法:
  • 使用 strlen() 比较两个字符串的长度。更长的字符串始终是最大的。
  • 如果长度相等,则使用 strcmp()

1

最短的方式应该是:

int mystrcmp(const char *a,const char *b)
{
  return strlen(a)-strlen(b)?strlen(a)-strlen(b):strcmp(a,b);
}

1
您可以使用_atoi64将字符串转换为64位整数。然后,您可以像预期的那样直接进行比较。根据您的编译器,_atoi64的名称可能不同。

0

它是按字面顺序排序的,这意味着以9开头的东西始终大于以1开头的东西。如果需要进行整数比较,您将需要使用 atoi。


我不能使用atoi,因为我的字符串中可能包含10个字符,而且atoi / atol无法处理。 - Nadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接