#include <assert.h>
#include <stdlib.h>
//以"."来区分每一段 ,
//由于每一段中可能有数字也可能有字母,
//故认为每一段是36进制数,之后比较36进制数的大小来判断每一部分的版本高低
// =0 版本1=版本2
// <0 版本1<版本2
// >0 版本1>版本2
int VesionCompare(const char* version1,const char* version2) {
const char* v1 = version1;
const char* v2 = version2;
long l1;
long l2;
while (*v1!='\0'&&*v2!='\0')
{
char* p1 = NULL;
char* p2 = NULL;
//利用strtol函数遇到'.'和'\0'转换结束的特性
l1 = strtol(v1, &p1, 36);
l2 = strtol(v2, &p2, 36);
//如果相等,比较下一部分
if (l1 == l2) {
if (*p1 != '\0')
{
v1 = p1+1;
}
else {
v1 = p1;
}
if (*p2 != '\0')
{
v2 = p2 + 1;
}
else {
v2 = p2;
}
}
else if (l1 < l2) {
return -1;
}
else {
return 1;
}
}
//最终比较结果可能某一部分会提前结束,故需要比较结束情况
if (*v1 == '\0'&&*v2 == '\0') {
return 0;
}
else if (*v1 == '\0'&&*v2 != '\0') {
return -1;
}
else {
return 1;
}
}
int main()
{
assert(VesionCompare("1.2.3a", "1.2.3b") < 0);
assert(VesionCompare("1.1.1", "1.1.1") == 0);
assert(VesionCompare("1.1.1", "1.1.2") < 0);
assert(VesionCompare("1.1.2", "1.1.1") > 0);
assert(VesionCompare("1.1.1.2", "1.1.1") > 0);
assert(VesionCompare("1.1.1.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.1.12.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.1.b.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.1.1.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.2.3.4.6", "1.2.3.5b") < 0);
return 0;
}
#include <stdlib.h>
//以"."来区分每一段 ,
//由于每一段中可能有数字也可能有字母,
//故认为每一段是36进制数,之后比较36进制数的大小来判断每一部分的版本高低
// =0 版本1=版本2
// <0 版本1<版本2
// >0 版本1>版本2
int VesionCompare(const char* version1,const char* version2) {
const char* v1 = version1;
const char* v2 = version2;
long l1;
long l2;
while (*v1!='\0'&&*v2!='\0')
{
char* p1 = NULL;
char* p2 = NULL;
//利用strtol函数遇到'.'和'\0'转换结束的特性
l1 = strtol(v1, &p1, 36);
l2 = strtol(v2, &p2, 36);
//如果相等,比较下一部分
if (l1 == l2) {
if (*p1 != '\0')
{
v1 = p1+1;
}
else {
v1 = p1;
}
if (*p2 != '\0')
{
v2 = p2 + 1;
}
else {
v2 = p2;
}
}
else if (l1 < l2) {
return -1;
}
else {
return 1;
}
}
//最终比较结果可能某一部分会提前结束,故需要比较结束情况
if (*v1 == '\0'&&*v2 == '\0') {
return 0;
}
else if (*v1 == '\0'&&*v2 != '\0') {
return -1;
}
else {
return 1;
}
}
int main()
{
assert(VesionCompare("1.2.3a", "1.2.3b") < 0);
assert(VesionCompare("1.1.1", "1.1.1") == 0);
assert(VesionCompare("1.1.1", "1.1.2") < 0);
assert(VesionCompare("1.1.2", "1.1.1") > 0);
assert(VesionCompare("1.1.1.2", "1.1.1") > 0);
assert(VesionCompare("1.1.1.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.1.12.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.1.b.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.1.1.2b", "1.1.1.2a") > 0);
assert(VesionCompare("1.2.3.4.6", "1.2.3.5b") < 0);
return 0;
}