C_and_CPP 板


LINE

開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev C++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) string.h 問題(Question): 我用 memcpy (Ptr->ListString, CharPtr, Length); 去餵資料,然後用link list 去存值,在只有兩個字元時,會多了殘餘值。 餵入的資料(Input): char StringOriginalData[100] = "Abian is son of the bitch"; 預期的正確結果(Expected Output): Abian 5 is 2 son 3 of 2 the 3 bitch 5 請按任意鍵繼續 . . . 錯誤結果(Wrong Output): Abian 5 iss 2 son 3 ofs 2 the 3 bitch 5 請按任意鍵繼續 . . . 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #include <string.h> char StringOriginalData[100] = "Abian is son of the bitch"; char StringChange[10] = "are"; typedef struct _VOCABULARY_LIST { char *ListString; struct _VOCABULARY_LIST *Node; }VOCABULARY_LIST; void TearOffAndAdd (VOCABULARY_LIST *Ptr); int main (int argc, char *argv[]) { VOCABULARY_LIST *FirstVocabulary; VOCABULARY_LIST *PtrVocabulary; FirstVocabulary = (VOCABULARY_LIST *)malloc (sizeof (VOCABULARY_LIST)); PtrVocabulary = FirstVocabulary; PtrVocabulary->Node = NULL; TearOffAndAdd (PtrVocabulary); system("PAUSE"); return 0; } void TearOffAndAdd (VOCABULARY_LIST *Ptr) { char *CharPtr; VOCABULARY_LIST *NewList; int Length; CharPtr = StringOriginalData; Length = strcspn (CharPtr, " "); while (Length != 0) { Ptr->ListString = (char *)malloc (Length * sizeof(char)); memcpy (Ptr->ListString, CharPtr, Length); printf ("%s", Ptr->ListString); printf (" %d\n",Length); NewList = malloc (sizeof (VOCABULARY_LIST)); NewList->Node = NULL; Ptr->Node = NewList; Ptr = NewList; CharPtr += (Length + 1); Length = strcspn (CharPtr, " "); } } 補充說明(Supplement): 這到底怎麼回事? -- 志願役普遍垃圾不代表每個志願役都是垃圾。 苗栗人智商普遍低落,不代表每個苗栗人智商都很低。 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.30.118
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1454378804.A.C9F.html
1F:→ ncoomb: is 2(四個字元);iss 2(五個字元; 02/02 11:08
那是我compiler 看build error的值阿! 我寫的就是因為is 是兩字元,可是我memcpy之後,就給他3字元這樣。 Ptr->ListString = (char *)malloc (Length * sizeof(char)); //我配2字元給他 memcpy (Ptr->ListString, CharPtr, Length); //挑前面兩字元複製過去 printf ("%s", Ptr->ListString); //然後印出來 printf (" %d\n",Length); //監看值有沒有取對 就是這樣,但是我娶小於兩個位元他就給我印出3個位元第三個位元還給我殘餘值 ※ 編輯: apologize (60.250.30.118), 02/02/2016 11:39:24
2F:→ hichcock: 有一種東西叫 "結束字元" 02/02 11:43
3F:→ remuswu1019: 我用你提供的程式碼編譯,執行結果正常耶! 02/02 11:55
4F:→ apologize: 要加這種東西喔 \0 02/02 12:48
5F:→ ncoomb: 我只是覺得跟len有關,不是殘值。怎不用strtok? 作業嗎? 02/02 14:22
不是作業,想說自己練習。printf 是我想監看值有沒有存進去而已。 單純想自己配置空間,然後看值有沒有存進去。
6F:推 overhead: memcpy只是如實的複製memory裡的值喔 不會幫你生出\0 02/03 00:27
7F:→ overhead: 另一方面%s是看\0決定結束在哪 你沒有給\0它不知道到哪 02/03 00:27
原來如此。
8F:→ overhead: 結束 02/03 00:28
9F:→ overhead: 你可以找memcpy strcpy strncpy的code比較差異 02/03 00:28
恩,所以我改成這樣寫: 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); 謝謝 ※ 編輯: apologize (60.250.30.118), 02/03/2016 09:46:46
10F:→ uranusjr: 為什麼要在這裡用 strcat... 02/03 09:50
11F:→ apologize: 不小心多寫出來了 = 02/03 09:55
12F:推 ncoomb: 恭喜啦。假設如果要效能好點的linklist,應減少使用memory 02/03 10:12
13F:→ ncoomb: 的函式。你覺得如何做呢? 02/03 10:12
14F:→ justinj: 除非要copy的東東是binary,結構之類才會去用memcpy 02/03 13:26
15F:→ apologize: 有差喔,我還以為沒差耶 02/03 14:17
16F:→ justinj: 如果你要沒差..copy的長度=strlen()+1...這不是更煩 02/03 16:57
17F:→ justinj: 啊...如果要部分的話是沒什麼差.. 02/03 17:00
18F:→ LPH66: memcpy 丟 strlen()+1 是做兩次功... 02/03 18:57







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

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

TOP