[问题] 版本字串比较

楼主: gn00618777 (非常念旧)   2020-09-28 23:19:07
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
请问神人们还有没有更漂亮的写法呢? 例如只用一个既定array之类的?
感谢指教
作者: Lipraxde (Lipraxde)   2020-09-28 23:54:00
写成状态机一个个 char 比过去?怎么写其实没差啦,不过这种东西可能要多加些注解,不然看起来像是在搞 obfuscation...
作者: kingofsdtw (不能閒下來!!)   2020-09-29 00:07:00
丢git check sum
作者: encorek22554 (二宝)   2020-09-29 01:34:00
可以参考leetcode.165
作者: LPH66 (-6.2598534e+18f)   2020-09-29 04:42:00
你其实可以在 while 循环里用两个变量暂存两个部份的数字这样同样的呼叫不用重复进行; 因为这种东西编译器很难知道你这两次呼叫其实是同一个东西
作者: loveme00835 (发箍)   2020-09-29 09:04:00
为了比较字串内容, 对字串内容做了什么事你知道吗?
作者: appleway (苹果爱天空)   2020-09-29 15:39:00
sscanf(v_str, “%d.%d.%d”, &major, &minor, &post);
楼主: gn00618777 (非常念旧)   2020-09-29 22:25:00
回Liprx大,你一个一个char去比较,那还未parse到'.'到的char该存到哪?回LPH66大,用两个变量去存? 请问你是一个一个char去parse吗? 还是一样用strtok 呢?回loveme大,字串的. 会被替换成\n回appleway大,你这方法满酷的,但要是不只两个小数点就无法比完全部了
作者: petercoin (彼得币)   2020-09-29 23:03:00
apple大应该是因为你们的规定所以写这样给你啦,如果有三个小数点就写三次阿。不然就用“.”来split之后看阵列长度有多少再转成数字比对也行
作者: loveme00835 (发箍)   2020-09-29 23:14:00
不太会 C, 不过大概就像酱 https://bit.ly/36hfTvS考虑到字串长度格式还有比较方式的不同, 写成可客制化复用性会高一些
作者: Lipraxde (Lipraxde)   2020-09-29 23:54:00
不懂要存什么。应该有两个 char* 指到当下比到哪就可以了吧?仔细想想好像也不用状态机 @@
作者: LPH66 (-6.2598534e+18f)   2020-09-30 16:34:00
我说的是 strtoul 的呼叫结果
楼主: gn00618777 (非常念旧)   2020-09-30 23:12:00
不解........... 我废= =你是说只要 if else 对不对阿我知道了,参考strcmp source code 他只要相减return strtoul(a) - strtoul(b) 就可以了
作者: LPH66 (-6.2598534e+18f)   2020-10-01 01:21:00
OK, 我再讲清楚一点好了:int v1 = strtol(...); int v2 = strtol(...);if(v1 > v2) {...} else if(v1 < v2) {...} else {...}你同一个函数写两次很有可能实际上就呼叫两次至于 return 相减结果这个写法你再仔细考虑清楚一次不是说你错, 但你要仔细确定有没有漏掉的地方
楼主: gn00618777 (非常念旧)   2020-10-02 09:07:00
欧欧 的确不用再strtoul。至于第二点我的确也少考虑少考虑了当某一个为NULL而另个为非NULL的情况回encorek22554大,感谢你提供的资讯

Links booklink

Contact Us: admin [ a t ] ucptt.com