您的位置:首页 > 其它

版本号大小比较算法

2016-05-27 00:00 281 查看

版本号大小比较算法

版本号之间比较大小,本质上是比较字符串之间的关系。这里给定两个版本号,你一定能迅速地区分出大小:

0.0.2
0.0.3

想要让计算机程序分辨她们的关系,可以直接使用
strcmp()
函数获取返回值,如果你在 iOS 系统下编程,也可以使用 NSString 类提供的
- (NSComparisonResult)compare:(NSNumber *)decimalNumber
方法。

但如果版本进化成下面这样,上面所说的 API 一定会产生错误的结果。

2.7.14.2345
2.12.8.1234

因为单纯的字符串比较大小的依据是每个字符的 ASCII 码。程序会认为字符
7
比字符
1
大,结果就是第一个版本号大于第二个版本号,这是错误的。

因此在识别之前,有必要了解一下版本号的组成部分,以及每一个数字的意义,这里已 GUN 风格的版本号作为说明。

版本号大致以下几个部分组成:

主版本号

次版本号

修正版本号

编译版本号

示例: 3.5.20.9527

在比较版本号时,正确的做法应该是,主版本号和主版本号比较,次版本号和次版本号比较等等。所以算法的核心应该是分离出版本号的各个组成部分。由此产生的算法会有多种。这里列举一个方式最简单粗暴的 C 语言代码:

/**
* 比较版本号
*
* @param v1 第一个版本号
* @param v2 第二个版本号
*
* @return 如果版本号相等,返回 0,
*         如果第一个版本号低于第二个,返回 -1,否则返回 1.
*/
int compare_version(const char *v1, const char *v2)
{
assert(v1);
assert(v2);
const char *p_v1 = v1;
const char *p_v2 = v2;

while (*p_v1 && *p_v2) {
char buf_v1[16] = {0};
char buf_v2[16] = {0};

char *i_v1 = strchr(p_v1, '.');
if (i_v1 != p_v1) {
if (!i_v1) break;
strncpy(buf_v1, p_v1, i_v1 - p_v1);
p_v1 = i_v1;
}
else
p_v1++;

char *i_v2 = strchr(p_v2, '.');
if (i_v2 != p_v2) {
if (!i_v2) break;
strncpy(buf_v2, p_v2, i_v2 - p_v2);
p_v2 = i_v2;
}
else
p_v2++;

int order = atoi(buf_v1) - atoi(buf_v2);
if (order != 0)
return order < 0 ? -1 : 1;
}

if (*p_v1 || *p_v2)
return (atof(p_v1) - atof(p_v2)) < 0 ? -1 : 1;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: