[問題] 版本字串比較

看板C_and_CPP作者 (非常念舊)時間3年前 (2020/09/28 23:19), 3年前編輯推噓5(5035)
留言40則, 8人參與, 3年前最新討論串1/2 (看更多)
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之類的? 感謝指教 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.171.134.9 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1601306354.A.E12.html ※ 編輯: gn00618777 (1.171.134.9 臺灣), 09/28/2020 23:44:33

09/28 23:54, 3年前 , 1F
寫成狀態機一個個 char 比過去?
09/28 23:54, 1F

09/28 23:56, 3年前 , 2F
怎麼寫其實沒差啦,不過這種東西可能要多加些註解,不
09/28 23:56, 2F

09/28 23:56, 3年前 , 3F
然看起來像是在搞 obfuscation...
09/28 23:56, 3F

09/29 00:07, 3年前 , 4F
丟git check sum
09/29 00:07, 4F

09/29 01:34, 3年前 , 5F
可以參考leetcode.165
09/29 01:34, 5F

09/29 04:42, 3年前 , 6F
你其實可以在 while 迴圈裡用兩個變數暫存兩個部份的數字
09/29 04:42, 6F

09/29 04:43, 3年前 , 7F
這樣同樣的呼叫不用重覆進行; 因為這種東西編譯器很難知道
09/29 04:43, 7F

09/29 04:43, 3年前 , 8F
你這兩次呼叫其實是同一個東西
09/29 04:43, 8F

09/29 09:04, 3年前 , 9F
為了比較字串內容, 對字串內容做了什麼事你知道嗎?
09/29 09:04, 9F

09/29 15:39, 3年前 , 10F
sscanf(v_str, “%d.%d.%d”, &major, &minor, &post);
09/29 15:39, 10F

09/29 22:25, 3年前 , 11F
回Liprx大,你一個一個char去比較,那還未parse到'.'
09/29 22:25, 11F

09/29 22:25, 3年前 , 12F
到的char該存到哪?
09/29 22:25, 12F

09/29 22:27, 3年前 , 13F
回LPH66大,用兩個變數去存? 請問你是一個一個char
09/29 22:27, 13F

09/29 22:28, 3年前 , 14F
去parse嗎? 還是一樣用strtok 呢?
09/29 22:28, 14F

09/29 22:29, 3年前 , 15F
回loveme大,字串的. 會被替換成\n
09/29 22:29, 15F

09/29 22:30, 3年前 , 16F
回appleway大,你這方法滿酷的,但要是不只兩個小數點
09/29 22:30, 16F

09/29 22:30, 3年前 , 17F
就無法比完全部了
09/29 22:30, 17F

09/29 23:03, 3年前 , 18F
apple大應該是因為你們的規定所以寫這樣給你啦,如果
09/29 23:03, 18F

09/29 23:03, 3年前 , 19F
有三個小數點就寫三次阿。不然就用“.”來split之後看
09/29 23:03, 19F

09/29 23:03, 3年前 , 20F
陣列長度有多少再轉成數字比對也行
09/29 23:03, 20F

09/29 23:14, 3年前 , 21F
不太會 C, 不過大概就像醬 https://bit.ly/36hfTvS
09/29 23:14, 21F

09/29 23:15, 3年前 , 22F
考慮到字串長度格式還有比較方式的不同, 寫成可客製
09/29 23:15, 22F

09/29 23:15, 3年前 , 23F
化複用性會高一些
09/29 23:15, 23F

09/29 23:54, 3年前 , 24F
不懂要存什麼。應該有兩個 char* 指到當下比到哪就可以
09/29 23:54, 24F

09/29 23:54, 3年前 , 25F
了吧?
09/29 23:54, 25F

09/29 23:54, 3年前 , 26F
仔細想想好像也不用狀態機 @@
09/29 23:54, 26F

09/30 16:34, 3年前 , 27F
我說的是 strtoul 的呼叫結果
09/30 16:34, 27F

09/30 23:12, 3年前 , 28F
不解........... 我廢= =
09/30 23:12, 28F

09/30 23:15, 3年前 , 29F
你是說只要 if else 對不對
09/30 23:15, 29F

09/30 23:16, 3年前 , 30F
阿我知道了,參考strcmp source code 他只要相減
09/30 23:16, 30F

09/30 23:16, 3年前 , 31F
return strtoul(a) - strtoul(b) 就可以了
09/30 23:16, 31F

10/01 01:21, 3年前 , 32F
OK, 我再講清楚一點好了:
10/01 01:21, 32F

10/01 01:22, 3年前 , 33F
int v1 = strtol(...); int v2 = strtol(...);
10/01 01:22, 33F

10/01 01:22, 3年前 , 34F
if(v1 > v2) {...} else if(v1 < v2) {...} else {...}
10/01 01:22, 34F

10/01 01:23, 3年前 , 35F
你同一個函數寫兩次很有可能實際上就呼叫兩次
10/01 01:23, 35F

10/01 01:24, 3年前 , 36F
至於 return 相減結果這個寫法你再仔細考慮清楚一次
10/01 01:24, 36F

10/01 01:24, 3年前 , 37F
不是說你錯, 但你要仔細確定有沒有漏掉的地方
10/01 01:24, 37F

10/02 09:07, 3年前 , 38F
歐歐 的確不用再strtoul。至於第二點我的確也少考慮
10/02 09:07, 38F

10/02 09:08, 3年前 , 39F
少考慮了當某一個為NULL而另個為非NULL的情況
10/02 09:08, 39F

10/02 09:22, 3年前 , 40F
回encorek22554大,感謝你提供的資訊
10/02 09:22, 40F
文章代碼(AID): #1VSVxouI (C_and_CPP)
文章代碼(AID): #1VSVxouI (C_and_CPP)