看板 C_and_CPP 關於我們 聯絡資訊
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
Lipraxde: 寫成狀態機一個個 char 比過去? 09/28 23:54
Lipraxde: 怎麼寫其實沒差啦,不過這種東西可能要多加些註解,不 09/28 23:56
Lipraxde: 然看起來像是在搞 obfuscation... 09/28 23:56
kingofsdtw: 丟git check sum 09/29 00:07
encorek22554: 可以參考leetcode.165 09/29 01:34
LPH66: 你其實可以在 while 迴圈裡用兩個變數暫存兩個部份的數字 09/29 04:42
LPH66: 這樣同樣的呼叫不用重覆進行; 因為這種東西編譯器很難知道 09/29 04:43
LPH66: 你這兩次呼叫其實是同一個東西 09/29 04:43
loveme00835: 為了比較字串內容, 對字串內容做了什麼事你知道嗎? 09/29 09:04
appleway: sscanf(v_str, “%d.%d.%d”, &major, &minor, &post); 09/29 15:39
gn00618777: 回Liprx大,你一個一個char去比較,那還未parse到'.' 09/29 22:25
gn00618777: 到的char該存到哪? 09/29 22:25
gn00618777: 回LPH66大,用兩個變數去存? 請問你是一個一個char 09/29 22:27
gn00618777: 去parse嗎? 還是一樣用strtok 呢? 09/29 22:28
gn00618777: 回loveme大,字串的. 會被替換成\n 09/29 22:29
gn00618777: 回appleway大,你這方法滿酷的,但要是不只兩個小數點 09/29 22:30
gn00618777: 就無法比完全部了 09/29 22:30
petercoin: apple大應該是因為你們的規定所以寫這樣給你啦,如果 09/29 23:03
petercoin: 有三個小數點就寫三次阿。不然就用“.”來split之後看 09/29 23:03
petercoin: 陣列長度有多少再轉成數字比對也行 09/29 23:03
loveme00835: 不太會 C, 不過大概就像醬 https://bit.ly/36hfTvS 09/29 23:14
loveme00835: 考慮到字串長度格式還有比較方式的不同, 寫成可客製 09/29 23:15
loveme00835: 化複用性會高一些 09/29 23:15
Lipraxde: 不懂要存什麼。應該有兩個 char* 指到當下比到哪就可以 09/29 23:54
Lipraxde: 了吧? 09/29 23:54
Lipraxde: 仔細想想好像也不用狀態機 @@ 09/29 23:54
LPH66: 我說的是 strtoul 的呼叫結果 09/30 16:34
gn00618777: 不解........... 我廢= = 09/30 23:12
gn00618777: 你是說只要 if else 對不對 09/30 23:15
gn00618777: 阿我知道了,參考strcmp source code 他只要相減 09/30 23:16
gn00618777: return strtoul(a) - strtoul(b) 就可以了 09/30 23:16
LPH66: OK, 我再講清楚一點好了: 10/01 01:21
LPH66: int v1 = strtol(...); int v2 = strtol(...); 10/01 01:22
LPH66: if(v1 > v2) {...} else if(v1 < v2) {...} else {...} 10/01 01:22
LPH66: 你同一個函數寫兩次很有可能實際上就呼叫兩次 10/01 01:23
LPH66: 至於 return 相減結果這個寫法你再仔細考慮清楚一次 10/01 01:24
LPH66: 不是說你錯, 但你要仔細確定有沒有漏掉的地方 10/01 01:24
gn00618777: 歐歐 的確不用再strtoul。至於第二點我的確也少考慮 10/02 09:07
gn00618777: 少考慮了當某一個為NULL而另個為非NULL的情況 10/02 09:08
gn00618777: 回encorek22554大,感謝你提供的資訊 10/02 09:22