我想用 C 读取一个 csv 文件,然后将每个标记存储在一个二维字符串数组中。看起来存储没问题,但是当我尝试从这个数组中打印一个元素时,我得到了奇怪的东西。这是程序:
#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 之前,我尝试打印 holder[0][2]。我应该得到“first”,但我实际得到的只是“ey”(可能来自 holder[2][1] - Whiskey)
最佳答案
那是因为 strtok() 修改了原始缓冲区,因此返回缓冲区变量中的指针。但是每次使用 fgets() 读取新行时,缓冲区的内容都会被修改!
将 strdup() 或 _strdup() 与 strtok() 结合使用,以便通过在堆中分配内存来获取 token 的副本:
lastToken = _strdup(strtok(buffer, delim));
和
lastToken = _strdup(strtok(NULL, delim));
不要忘记,您还会考虑在某一天或另一天释放分配的内存。
关于c - 处理文件 - 二维字符串数组问题(C 语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24229588/