→ 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