[問題] 關於存取指標所指的內容

看板C_and_CPP作者 (BOB)時間13年前 (2011/04/19 20:37), 編輯推噓0(0020)
留言20則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC, Linux 問題(Question): 從buf複製了一段文字到tmp裡面,這串文字的內容大概像是下面Input的那一串, 然後會print出一個類似表格這樣, 但我想做的是把這串字切割開,然後重新篇排某些欄位, 像Output寫的那樣,像是把C的欄位都調整到B前面, 可是這串字的是個字元指標所指的,char *buf這樣, 所以在撰寫上碰到些問題,不知道怎麼複製出指標所指的記憶體位置存放的值, 想把字串切割開之後存放到另一個陣列上再重新編排塞回去 餵入的資料(Input): AAA\tBBB\tCCC\tDDD\nAA1\tBB1\tCC1\tDD1\nAA2\tBB2\tCC2\tDD2 AAA BBB CCC DDD AA1 BB1 CC1 DD1 AA2 BB2 CC2 DD2 預期的正確結果(Expected Output): AAA\tCCC\tBBB\tDDD\nAA1\tCC1\tBB1\tDD1\nAA2\tCC2\tBB2\tDD2 AAA CCC BBB DDD AA1 CC1 BB1 DD1 AA2 CC2 BB2 DD2 錯誤結果(Wrong Output): 似乎只有把pointer所存放的記憶體位置複製到要重新排版用的arr[]中, 程式碼(Code):(請善用置底文網頁, 記得排版) 1 CHAR *tmp, *token_1, *token_2; 2 tmp = Malloc(MAX_BUF_LEN); 3 memcpy(tmp, buf, buf_size); 4 CHAR arr[35]; 5 6 while ( (token_1 = strsep(&tmp, "\n")) != NULL ) { 7 i = 0; 8 while ( ((token_2 = strsep(&token_1, "\t")) != NULL) ) { 9 10 strcpy(&arr[i], token_2); 11 debug_printf("%s\t%d", &arr[i], i); 12 i++; 13 } 14 } 補充說明(Supplement): 可能是我觀念錯誤,我覺得應該要寫這樣 strcpy(arr[i], *token_2); 可是make下去卻會有問題,pointer from integer without a cast 改成 strcpy(&arr[i], token_2); 就過了,之後雖然從我dubug的print看到是正常的, 但是這樣是否只是把pointer所儲存的記憶體位置複製到arr這個陣列中咧? 在第二個while出來之後把arr的內容print出來都不是我要的值, 所以困擾不知道是哪裡出錯,不知道該怎麼改才能存放正確的內容進去arr裡面重排版, 所以還請各位高手幫我解答給我些意見, 文章有點長,感謝大家幫我看看。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.134.133.66

04/19 20:41, , 1F
你預期你的 arr 將是怎麼存放資料的?
04/19 20:41, 1F

04/19 20:41, , 2F
換句話說,在程式跑完後,你希望你的 arr 會變怎麼樣?
04/19 20:41, 2F

04/19 20:42, , 3F
AAA, BBB, CCC, DDD這樣,然後一行一行重新排列
04/19 20:42, 3F

04/19 20:42, , 4F
接著下一行就把原本的蓋掉,然後再排列這樣
04/19 20:42, 4F

04/19 20:43, , 5F
請問這樣有表達到我arr想存放內容的意思嗎
04/19 20:43, 5F

04/19 20:44, , 6F
坦白說我看不懂 XD
04/19 20:44, 6F

04/19 20:44, , 7F
我想把arr當暫時存放用,然後snprintf再把這些排列到另一字串
04/19 20:44, 7F

04/19 20:45, , 8F
每行排列完就加到另一組字串上,所以大概像有三行,arr[0]會變
04/19 20:45, 8F

04/19 20:46, , 9F
三次不同內容這樣吧
04/19 20:46, 9F

04/19 20:51, , 10F
類似這樣的效果嗎? http://pastie.org/1811435
04/19 20:51, 10F

04/19 21:28, , 11F
恩,類似,strtok回傳一個指標指出切割的位置,我想把那位置上的
04/19 21:28, 11F

04/19 21:28, , 12F
資料存取到另一個陣列上再去做排序這樣
04/19 21:28, 12F

04/19 21:43, , 13F
04/19 21:43, 13F

04/19 21:55, , 14F
對,只是這樣寫就沒有個別存放到不同位置再去重新排列了吧
04/19 21:55, 14F

04/19 21:56, , 15F
like this: http://pastie.org/1811631 sorry pseudo code
04/19 21:56, 15F

04/19 21:59, , 16F
原PO你的問題在於arr[]的定義, 你這樣寫只能放一個字串而已
04/19 21:59, 16F

04/19 22:01, , 17F
所以有compile error, run time 也會error
04/19 22:01, 17F

04/19 22:01, , 18F
你可以將 j大的程式改成二層loop, 再改arr 定義, 就可以了.
04/19 22:01, 18F

04/19 22:05, , 19F
了解,所以就是二維陣列嗎,感謝了,我再嘗試看看
04/19 22:05, 19F

04/19 22:05, , 20F
感謝兩位高手
04/19 22:05, 20F
文章代碼(AID): #1DhO7ta3 (C_and_CPP)