c - 处理文件 - 二维字符串数组问题(C 语言)

标签 c arrays string file csv

我想用 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/

相关文章:

结合openmp和sse指令

c - 如何在函数内获取数组大小?

javascript - 使用 jQuery 从 JSON 树读取特定值

Python 在使用字符串对数据框列进行 .replace 时忽略前导空格

java - java中如何在字符串的字符两侧添加空格?

c - 使用 C 分隔成对括号中的内容可能是一个好的策略

iphone - EXC_BAD_ACCESS 在保留的 UIImage 上调用 drawRect

arrays - 你能在快速排序中选择你想要的任何主元吗?

arrays - Ruby if else in array.each

string - 两个变量作为单元格引用