[問題] 字串分開實作
問題(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
→
06/12 17:11, , 1F
06/12 17:11, 1F
推
06/12 17:13, , 2F
06/12 17:13, 2F
我是想用指標陣列沒錯,可是如果我沒約束指標的大小
例如第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
→
06/12 17:22, , 3F
06/12 17:22, 3F
→
06/12 17:23, , 4F
06/12 17:23, 4F
→
06/12 18:05, , 5F
06/12 18:05, 5F
→
06/12 18:17, , 6F
06/12 18:17, 6F
我把我的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
推
06/12 20:38, , 7F
06/12 20:38, 7F
→
06/12 20:39, , 8F
06/12 20:39, 8F
推
06/12 22:03, , 9F
06/12 22:03, 9F
討論串 (同標題文章)