※ 引述《gn00618777 (非常念旧)》之铭言:
: release 版本格式: x.x.xxx
: 目的 : 1.1.066 以及 1.1.66 ,程式都能认定同一版本。
: (为了防止开发者少填1个0,也就是1.1.66)
: (少填1个0,会使strncmp 1.1.66 > 1.1.066)
: (我是觉得公司都已经规定格式了,1.1.66不就不被允许吗..)
: (但上层总是想得比我们下面的人多拉~)
: (所以我用了每小数点为分隔来求出每个数字来比)
: (因此就能认定1.1.066 == 1.1.66了)
: version 会存在既定 array(a_version, b_version)因为到时写成 fun传入来源指标
: 用strtok系列会改变来源位址,所以用a_version, b_version既定来存
: char a_version[] = "1.1.066";
: char b_version[] = "1.1.66";
: char *a_ptr = NULL;
: char *b_ptr = NULL;
: char *p,*q;
: int i = 0;
: int result = 0;
: p = strtok_r(a_version, ".", &a_ptr);
: q = strtok_r(b_version, ".", &b_ptr);
: while(p != NULL && q != NULL) {
: if((int)strtoul(p, NULL, 10) > (int)strtoul(q, NULL, 10)) {
: result = 1;
: break;
: } else if((int)strtoul(p, NULL, 10) < (int)strtoul(q, NULL, 10)) {
: result = -1;
: break;
: } else {
: //do nothing
: }
: p = strtok_r(NULL, ".", &a_ptr);
: q = strtok_r(NULL, ".", &b_ptr);
: }
: return result; //1: a>b -1:a<b 0: a==b
要用一个 buffer 的写法我放弃了,我觉得应该还是要用两个空间去存比较安全
原因 1 strtok 会改到source
原因 2 确保source 进来结尾能是'\0'
有些大大热心提供的程式我还未消化完,非常感谢。我先提供自己的完整写法
有些环境编译器没有 strtok_r的header,我是使用 https://reurl.cc/bRVono
glibc porting过来的。
并搭配 leetcode 165 的测试题 https://reurl.cc/GrjYVG 验证。另外我比leetcode
要求的回传1 or -1 or 0 更进一步,我的不只回传1 -1 0 ,可以回传大多少小多少
有觉得更好的建议再多多指教囉。
int compare_version(const char *str1_version, const char *str2_version) {
char a_version[FW_VERSION_SIZE+1] = {0};
char b_version[FW_VERSION_SIZE+1] = {0};
char *a_ptr = NULL, *b_ptr = NULL;
char *p = NULL, *q = NULL;
int a = 0, b = 0;
if(str1_version)
strncpy(a_version, str1_version, FW_VERSION_SIZE);
if(str2_version)
strncpy(b_version, str2_version, FW_VERSION_SIZE);
p = strtok_r(a_version, ".", &a_ptr);
q = strtok_r(b_version, ".", &b_ptr);
if(p) a = atoi(p);
if(q) b = atoi(q);
if(a != b) return a - b;
while(a == b) {
p = strtok_r(NULL, ".", &a_ptr);
q = strtok_r(NULL, ".", &b_ptr);
p != NULL ? (a = atoi(p)) : (a = 0);
q != NULL ? (b = atoi(q)) : (b = 0);
if(p == NULL && q == NULL)
return 0;
}
return a - b;
}