比较包含数字的字符串

时间:2010-08-22 09:52:51

标签: c string comparison

你好我比较了两个包含数字的char *变量的问题 char1 = "999999"char2="11111111" 当我使用strcmp函数时,它将返回char1变量大于char2 甚至错了。 (我知道我可以比较使用atoi函数直到字符串中的9个字符,但我需要使用10这样才能减少这种可能性。)

6 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:4)

避免atoi和朋友的一种稍微麻烦的方法是用零填充两个字符串中较短的一个。或者,假设没有前缀零,只需首先比较长度(因为较短的字符串必须具有较低的值),然后运行lexiographic比较:

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

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

答案 2 :(得分:3)

如果字符串没有前导/尾随垃圾,请使用此算法:

  • 使用strlen()比较两个字符串的长度。较长的一个总是最大的。
  • 如果长度相等,请使用strcmp()

答案 3 :(得分:1)

您可以使用_atoi64将字符串转换为64位整数。然后,您可以按照您的预期直接比较它们。根据您的编译器,_atoi64可能被称为不同的东西。

答案 4 :(得分:1)

最短路应该是:

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

答案 5 :(得分:0)

按字面顺序排序,这意味着从9开始的东西总是大于从1开始的东西。如果你需要进行整数比较,你将不得不使用atoi。