【发布时间】:2014-03-13 09:48:23
【问题描述】:
我有一个文件,我想读取每一行,用制表符标记它并存储到一个数组中。但事实证明,token[0]..token[4] 指向的是 strtok() 产生的每个字符的地址。所以 token[0]...token[4] 每次我在文件的下一行调用 strtok 时都会改变。我该如何纠正?如果我尝试char tokens[MAX_SIZE] 而不是char* tokens[MAX_SIZE],则会发生转换错误,因为 strtok 返回 char *。
文件是
20 34 90 10 77
80 12 37 29 63
45 21 55 18 46
我的代码是:
FILE *f;
if ((f = fopen("myinput.txt","r")) == NULL) {
perror("Failed to open file:");
return -1;
}
char * line;
size_t len = 0;
char *tokens[MAX_SIZE];
int i = 0;
while (getline(&line, &len, f) !=-1) {
char* lineWithoutNullByte = strtok(line,"\n");
tokens[i]=strtok(lineWithoutNullByte,"\t");
i++;
int x = 1;
while (x){
tokens[i] = strtok(NULL, "\t");
if (tokens[i] == NULL){
x=0;
}else{
i++;
}
}
printf("test: %s %s %s %s %s\n", tokens[0],tokens[1],tokens[2],tokens[3],tokens[4] );
}
预期的输出是
test: 20 34 90 10 77
test: 20 34 90 10 77
test: 20 34 90 10 77
但我得到了:
test: 20 34 90 10 77
test: 80 12 37 29 63
test: 45 21 55 18 46
澄清:
这意味着,如果我打印整个 tokens 数组,我将得到
45 21 55 18 46
45 21 55 18 46
45 21 55 18 46
【问题讨论】:
-
为什么第一行会重复三遍?你得到的匹配文件,不是吗?
-
您在最后一行的第 2 行看到,我只打印令牌 0 到 4。我试图找出问题所在。
-
如果我打印整个令牌数组,它将显示为 45 21 55 18 46 45 21 55 18 46 45 21 55 18 46
-
@LearningC 我不确定你在说什么。我想获取文件中每个值的大小为 15 的数组。
-
char tokens[MAX_SIZE][3];...token=strtok(...);strcpy(tokens[i],token);