使用文件 - 二维字符串数组问题(C语言)

时间:2014-06-15 12:28:19

标签: c arrays string file csv

我想从带有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

1 个答案:

答案 0 :(得分:2)

那是因为strtok()修改了原始缓冲区,因此在缓冲区变量中返回一个指针。但是每次使用fgets()读取新行时,都会修改缓冲区的内容!

将strdup()或_strdup()与strtok()结合使用,以便通过在堆中分配内存来获取令牌的副本:

lastToken = _strdup(strtok(buffer, delim));

lastToken = _strdup(strtok(NULL, delim));

不要忘记你还要考虑在一天或另一天释放分配的内存。