看板 C_and_CPP 關於我們 聯絡資訊
問題(Question): 正在想一個實作問題:如何將一個長的字串char*按照分隔符號(\t)分成幾個char* 舉例:某文字檔有長字串如下: Number (\t) First Name (\t) Last Name (\t) Points (\t) Flavor (\n) 1 (\t) Eve (\t) Jackson (\t) 94 (\t) 3.45 (\n) 2 (\t) John (\t) Doe (\t) 80 (\t) 9.21 (\n) 3 (\t) Adam (\t) Johnson (\t) 67 (\t) 4.80 (\n) 4 (\t) Jill (\t) Smith (\t) 50 (\t) 2.22 (\n) 然後我設兩個pointer, char *line 跟 char **t(sizeof(char*)*MAXITEM) 我用fgets(line,SIZE,fp);把字串一行一行載入line後,把\t跟換成\0, 再把line的\0位置address轉給t 以第1行為例: t[0] = line, t[0] = (char*)malloc(6-0+1) -> *t[0] = "Number\0" ? t[1] = line+7, t[1] = (char*)malloc(17-7+1) -> *t[1] = "First Name\0" ? t[2] = line+18, t[2] = (char*)malloc(27-18+1) -> *t[2] = "Last Name\0" ? t[3] = line+28, t[3] = (char*)malloc(34-28+1) -> *t[3] = "Point\0" ? t[4] = line+35, t[4] = (char*)malloc(41-35+1) -> *t[4] = "Flavor\n" ? 用這種方法載入第2行,第3行後,我就能用atoi或atof把某些t[i]轉成數字。 但是我不太懂要怎麼把**t跟*line設在同一address上 還有程式跑完我要free的話,兩個adress重疊會不會出問題? 還是板友有更好的方法可以建議? 我是希望能儘可能用效率高的方法(而且是用C的語法) 希望各位能理解我想做的東西。 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 90.41.134.196 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1434099205.A.B8B.html
Feis: 不知道你想幹嘛,把\t換\0後生個指標陣列指一指就好 06/12 17:11
fireslayer: 你是不是在找 Strtok? 06/12 17:13
我是想用指標陣列沒錯,可是如果我沒約束指標的大小 例如第2行: 1 (\t) Eve (\t) Jackson (\t) 94 (\t) 3.45 (\n) 把每個欄位開頭位置弄成指標陣列: t[0] = 0 (1) t[1] = 2 (E) t[2] = 6 (J) t[3] = 14 (9) t[4] = 17 (3) 如果我要將t[0]用atoi轉成數字1,在沒有限制指標大小的情況可行嗎? 同理,我要將t[3]轉成數字94或將t[4]轉成浮點數3.45,這樣OK嗎? ※ 編輯: wtchen (90.41.134.196), 06/12/2015 17:21:53
wtchen: strtok我知道,可是那不是我想要的 06/12 17:22
wtchen: 還是遇到atoi遇到\0會自動停下來? 06/12 17:23
MOONRAKER: 你知道atoi()的參數是C String嗎 06/12 18:05
bibo9901: 你要的看起來就是strtok啊 06/12 18:17
我把我的code貼上來好了 簡而言之,我希望能把每行資料讀進char *line,然後透過getData函式 把line裏面的item(用\t分開)變成char*們 都輸入char** t 裏面, 然後getData回傳item個數 這樣我就可以用t[i]去做後續的處理...不知道這樣想法對不對 PS: strtok好像是對的,但是可能是我不太會用... 不過老實說我也想要問實作strtok的方法... 程式同步公佈在此: https://gist.github.com/gnitnaw/11ad7e7a98e4ebc8601f #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 256 #define NITEM 15 //簡而言之,我希望能把每行資料讀進char *line,然後透過getData函式 //把line裏面的item(用\t分開)變成char*們 都輸入char** t 裏面, //然後getData回傳item個數 //這樣我就可以用t[i]去做後續的處理... int getData(char* line, char** t); int main(void) { char s; int i, N; char **t = (char**)malloc(sizeof(char*)*(NITEM)); char* line = (char*)malloc(sizeof(char)*SIZE); FILE *fp = fopen("Example_table.txt", "r"); if (!fp) { perror("Error!"); } fgets(line,SIZE,fp); printf("%s \n", line); N = getData(line, t); for (i=0; i<N; ++i) { printf("%s, ", t[i]); free(t[i]); } fclose(fp); free(line); free(t); return 0; } int getData(char* line, char** t) { int item=0; char *c = strtok(line,'\t'); t[item++] = c; while (c != NULL && item < NITEM) { c = strtok(NULL,'\t'); t[item++] = c; } return item; } ※ 編輯: wtchen (90.41.134.196), 06/12/2015 20:29:44
lj0113: 2F說的對, newPtr = strtok( s1, " \n" ); 06/12 20:38
lj0113: s1會被strtok拿去弄, 所以不可以宣告為constant string 06/12 20:39
arthur104: free(t[i])會出事吧 06/12 22:03