C_and_CPP 板


LINE

※ 引述《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; } --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.84.195 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1601650535.A.301.html ※ 編輯: gn00618777 (59.115.84.195 臺灣), 10/02/2020 23:01:41
1F:→ loveme00835: 你的問題在於還沒分析完全就開始實作, C 語言有兩種 10/03 09:27
2F:→ loveme00835: 字串, 一種是 C-style string, 另一種不是用內容來分 10/03 09:27
3F:→ loveme00835: 而是用 (char*,size_t) 這樣的 tuple描述, 前者無法 10/03 09:28
4F:→ loveme00835: 支援巢狀結構, 所以 strtok() 是用截斷的方式, 但我 10/03 09:29
5F:→ loveme00835: 們如果要想拿出子字串, 應該使用後者, 這樣既不用改 10/03 09:29
6F:→ loveme00835: 變輸入字串內容, 也可以更有系統的描述問題, 在你的 10/03 09:30
7F:→ loveme00835: 問題裡, 目標即是將輸入的字串拆成 3 個 tuple, 分別 10/03 09:31
8F:→ loveme00835: 為: (a_version, 1), (a_version + 2, 1), (a_versio 10/03 09:33
9F:→ loveme00835: n + 4, 3) 只要給你任何字串都有辦法拆出 n 個 tuple 10/03 09:34
10F:→ loveme00835: 那版本字串的比對問題就轉變為 n 的 tuple 各自去比 10/03 09:34
11F:→ loveme00835: 較的問題了, 比較 tuple 甚至也不一定要先轉成整數, 10/03 09:35
12F:→ loveme00835: 類似像 strncmp() 的邏輯甚至是反方向地比對字元也是 10/03 09:36
13F:→ loveme00835: 原文推文已經提供可以客製化的實作了, 核心概念就是 10/03 09:39
14F:→ loveme00835: 兩個 while 迴圈去萃取 tuple 而已, 剩下就看你理解 10/03 09:39
15F:→ loveme00835: 程度 10/03 09:39
16F:推 annheilong: 想知道C語言第二種字串的型別是...? 10/05 10:07
17F:推 LPH66: std::string 內部即是這種結構, 只除了 char* 也是他管而已 10/05 10:19
18F:→ LPH66: 這種表示法的好處是字串長度是 O(1) 操作, 不像 strlen 是 10/05 10:20
19F:→ LPH66: O(n) 操作; 另外就是如果 char* 不是自己管的 (例子像是 10/05 10:20
20F:→ LPH66: std::string_view) 那就能如上面推文進行更有彈性的操作 10/05 10:20
21F:→ LPH66: 以上是 C++ 的東西, 但 C 也不是不能自己自訂一個結構來用 10/05 10:21
22F:→ LPH66: 那因為這種做法是因為一種 Pascal 的實作所推廣的 10/05 10:22
23F:→ LPH66: 因此一般會稱這種做法的字串叫 pascal string 10/05 10:22
24F:→ loveme00835: 另一種字串即是在標準函式庫裡抽象化存在, 但語言上 10/05 11:13
25F:→ loveme00835: 沒有明確定義的, 如 strncmp()/strncpy() 等, 從介面 10/05 11:16
26F:→ loveme00835: 上會衍伸一個問題: 如果 C-style 字串只複製前面 n 10/05 11:17
27F:→ loveme00835: 個字元, 不包含 '\0', 那複製而來的算不算字串? 雖然 10/05 11:18
28F:→ loveme00835: 它和 C-style 字串不同, 但卻已經是字串處理很基本的 10/05 11:20
29F:→ loveme00835: 元件 10/05 11:21







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP