C_and_CPP 板


LINE

我沒有仔細看你的本文,不過針對你補充的部分: Ptr->ListString = (char *)malloc ((Length + 1) * sizeof(char)); memset (Ptr->ListString, '\0', Length + 1); memcpy (Ptr->ListString, CharPtr, Length); strcat (Ptr->ListString , "\0"); printf ("%s", Ptr->ListString); printf (" %d\n",Length); 有些建議 1. strxxx系列function以及%s顧名思義都是在處理string string的定義就是結尾為0(='\0')的char array 因此你沒有放'\0'在結尾之前,都別用這些functions,會壞掉 (這也是為啥有strxxx_s系列的理由) 2. memxxx系列的效率比strxxx系列高很多 因為後者除了要處理array以外,還要隨時注意'\0'到了沒 3. 雖然memxxx比較快,但copy本質上就是比用指標重複利用一塊data來得慢 所以盡量用指標處理資料傳遞,當然用指標比較難而且比較多限制就是 4. 如果你打定主意這個array都要用string形式處理,那memset就不用做了 浪費成本 舉個例子: a[0]='A', a[1]='B', a[2]='\0', a[3]='C' b[0]='A', b[1]='B', b[2]='\0', b[3]='\0' 用printf("%s %s", a, b)印出來的a,b字串是一模一樣的,都是AB 不管a[3]是多少,從s[0]開始掃到a[2]發現有'\0'時,電腦就會結束掃下去了 5. 承第一點,strcat的意思是"在str開始第一個出現'\0'的位置後面接上指定字串" 言下之意是,如果你能接上指定字串"\0",代表它前面有個'\0' 另外"\0"是個字串,裡面有\跟0,用單引號包起來的'\0'才是0的意思 你strcat (Ptr->ListString , "\0");這一行是一點意義也沒有的 真正幫你補0的是你一開始的memset (Ptr->ListString, '\0', Length + 1); 可如同我第四點所說的,你這樣做是有點浪費成本的 因為[0]~[Length]才改完的值隨即會被memcpy蓋過,很心酸~ (也是可以寫啦,看風格,有人覺得浪費點成本但是初始時寫memset比較整齊) 建議如下: Ptr->ListString = (char *)malloc ((Length + 1) * sizeof(char)); memcpy (Ptr->ListString, CharPtr, Length); //等同[0]~[Length-1]裡放滿值 *(Ptr->ListString + Length) = '\0'; //[Length]放'\0',等同補成完整string printf ("%s", Ptr->ListString); //因為[Length]放'\0',所以可以正常顯示 printf (" %d\n",Length); --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.166.43.139
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1454516460.A.04E.html ※ 編輯: overhead (118.166.43.139), 02/04/2016 00:21:58 ※ 編輯: overhead (118.166.43.139), 02/04/2016 00:26:17
1F:推 LPH66: "\0" 是 char 陣列 {(char)0, (char)0} 喔 02/04 00:42
2F:→ LPH66: "\\0" 才是 {'\\', '0' ,'\0'} 02/04 00:42
3F:→ overhead: 嗚喔!原來如此 02/04 00:52
4F:推 apologize: 受教了 02/04 09:20
5F:推 apologize: http://openhome.cc/Gossip/Ruby/String.html 02/04 11:18
6F:→ apologize: 我看這個字串表示 \0 也是代表空字元阿 02/04 11:18
7F:→ apologize: \"表示忽略(Escape)字元 02/04 11:19
8F:推 ncoomb: 很用心耶。不過第二點我覺得有點要修正,就Big O來看兩者 02/04 13:07
9F:→ ncoomb: 相對應的memxxx和strxxx當n相同,常數忽略,二者的Big O 02/04 13:07
10F:→ ncoomb: 相同。如果要細究到常數,跟平台會有關,簡單說你要計算CP 02/04 13:07
11F:→ ncoomb: U二者程式全部指令集所耗T數,因CPU可能會強化一些行為, 02/04 13:07
12F:→ ncoomb: 就不能看code去分析了。說錯的地方在討論吧。 02/04 13:07
13F:推 cobrasgo: 請愛用strn系列 02/04 18:25
14F:推 LPH66: 不要隨便推廣 strn 系列...它反而是最需要小心使用的函式 02/05 00:23
15F:→ qsort: 來用snprintf()嘛~好用耶,不試看看嗎? 02/05 10:27
16F:推 wulouise: 不過string有分zero-terminated跟沒有的吧? 02/05 22:05
17F:推 wulouise: *null 02/05 22:07
18F:→ cobrasgo: "最需要"小心使用是從何而來?我以為strn是應str的問題 02/07 01:00
19F:→ cobrasgo: 生出來的不是嗎? 02/07 01:00
20F:推 cobrasgo: 對我來說看到n就知道我要注意了,光這點就完勝str系列 02/07 01:05
21F:推 LPH66: 問題不在 n 而在他屬於 str 系列函式 02/07 01:14
22F:→ LPH66: 所有 str 系列只有 strn 不加尾巴的 '\0' 02/07 01:14
23F:→ LPH66: memcpy/memmove 不是 str 系列會特別注意使用狀況 02/07 01:14
24F:→ LPH66: 但 str 系列因為其他都會加 '\0' 就這個不會 02/07 01:15
25F:→ LPH66: 才會說要特別注意使用 02/07 01:16
26F:推 cobrasgo: 都有個N了,還幫你加一個字元不是很奇怪? 02/08 00:36
27F:推 cobrasgo: 我知道了,這是思考邏輯的不同。你是從str系列來思考, 02/08 00:42
28F:→ cobrasgo: 我是從有個n來思考 02/08 00:43
29F:→ LPH66: 有 n 也不一定不加喔, snprintf 就會加 '\0' 02/08 01:11
30F:推 cobrasgo: 臉丟大了(掩面),我的確不知道snprintf會加null囧,目前 02/09 23:59
31F:→ cobrasgo: 沒出過問題應該是我習慣把buffer會多加一點…感謝指正 02/09 23:59







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燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP