我想从带有C的csv文件中读取,然后将每个令牌存储在2D字符串数组中。看来存储没问题,但是当我尝试从这个数组中打印一个元素时,我得到了一些奇怪的东西。这是程序:
#include <stdio.h>
#include <string.h>
#define BUFFER_SIZE 256
int main(){
FILE *testFile = fopen("test.csv", "r");
char buffer[BUFFER_SIZE];
char *delim = ",";
char *lastToken;
char *holder[50][50];
int i, i2;
if(testFile == NULL){
printf("Error!");
} else {
i = 0;
while(fgets(buffer, BUFFER_SIZE, testFile) != NULL){
i2 = 0;
lastToken = strtok(buffer, delim);
while(lastToken != NULL){
holder[i][i2] = lastToken;
printf("holder[%i][%i] - %s\n", i, i2, holder[i][i2]);
lastToken = strtok(NULL, delim);
i2++;
}
i++;
}
fclose(testFile);
} //if file is opened (endif)
printf("%s\n", holder[0][2]);
return 0;
}
text.csv内容:
1,Beer,first,30
2,Rakija,second,50
3,Whiskey,third,95
当我运行程序时,我得到:
holder[0][0] - 1
holder[0][1] - Beer
holder[0][2] - first
holder[0][3] - 30
holder[1][0] - 2
holder[1][1] - Rakija
holder[1][2] - second
holder[1][3] - 50
holder[2][0] - 3
holder[2][1] - Whiskey
holder[2][2] - third
holder[2][3] - 95
ey
在返回0之前,我尝试打印持有人[0] [2]。我应该得到“第一个”,但实际得到的只是“ ey ”(可能是持有人的一部分[2] [1] - Whisk ey )
答案 0 :(得分:2)
那是因为strtok()修改了原始缓冲区,因此在缓冲区变量中返回一个指针。但是每次使用fgets()读取新行时,都会修改缓冲区的内容!
将strdup()或_strdup()与strtok()结合使用,以便通过在堆中分配内存来获取令牌的副本:
lastToken = _strdup(strtok(buffer, delim));
和
lastToken = _strdup(strtok(NULL, delim));
不要忘记你还要考虑在一天或另一天释放分配的内存。