c遍历数组

时间:2015-11-17 15:15:21

标签: c arrays

我的代码存在问题 我读了一个文件,然后将文件中的数据推送到结构数据类型

但是迭代dataValue时应该是struct的数组 它给了我相同的dataValue,特别是文件中的最后一个。

int main() {
    FILE *file;
    struct characteristic {
        double * dval;
        double n;
        char * name;
    };
    struct characteristic dataValue[150];
    if ((file = fopen("/XXX/XXX/XXX/XXX/data", "r"))
            == NULL) {
        puts("error reading file");
        exit(1);
    } else {
        int i = 0;
        double var1, var2, var3, var4;
        char * etiq = malloc(sizeof(char) * 100);
        while (fscanf(file, "%lf,%lf,%lf,%lf,%s \n", &var1, &var2, &var3, &var4,
                etiq) != EOF) {
            struct characteristic *new_node;
            new_node = (struct characteristic *) malloc(
                    sizeof(struct characteristic));
            new_node->dval = &var1;
            (new_node->dval)++;
            new_node->dval = &var2;
            (new_node->dval)++;
            new_node->dval = &var3;
            (new_node->dval)++;
            new_node->dval = &var4;
            new_node->name = etiq;
            puts("=================================================");

            printf("the name of characteristic number %d est : %s .\n", i,
                    new_node->name);
            dataValue[i].dval = new_node->dval;
            dataValue[i].name = new_node->name;
            dataValue[i].n = i;
            i++;
        }

    }
    int i,j;
    for (i = 0; i < sizeof(dataValue) / sizeof(struct characteristic); i++) {
        printf("second name of characteristic number %d est : %s .\n", i,
                dataValue[i].name);
        for (j = 0; j < 4; j++) {

            printf("bla value of vector number %d at index %d est : %lf \n", i,
                    j, *(dataValue[i].dval + j));
        }
    }
    return EXIT_SUCCESS;
}

文件包含数据如: 1.0,2.7,4.9,1.5,名称

2 个答案:

答案 0 :(得分:3)

您的代码使用的是未初始化的指针dval,并且您在打印之前将其分配给超出范围的局部变量的地址。这不是在C中创建数组的方法。

您可以使用dval将数组分配到malloc,但是您也必须free()该数组。既然您知道节点中将有四个double,那么将dval作为四个项目的数组会更简单,如下所示:

struct characteristic {
    double dval[4];
    double n;
    char * name;
};

现在,您可以使用指针或数组语法进行分配:

dataValue[i].dval[0] = var1;
dataValue[i].dval[1] = var2;
dataValue[i].dval[2] = var3;
dataValue[i].dval[3] = var4;
dataValue[i].n = i;
// Store etiq in the name, or make a copy:
dataValue[i].name = etiq;
// Prepare etiq for the next loop
etiq = malloc(100); // No need to multiply by sizeof(char)

答案 1 :(得分:1)

struct包含指向双double *dval的指针。看来你打算用它作为4个双打的数组。但是你没有为4个双打分配内存。在struct中存储4个双打的推荐方法是在其中定义一个数组。

struct characteristic {
    double dval[4];
    double n;
    char * name;
};

name存在类似问题。在while循环外部分配一次100字节的内存,并获得一个名为etiq的指针。然后,对于dataValue的每个元素,您将name设置为同一个指针etiq到您用fscanf覆盖的同一个块。如果你想在char*中使用struct而不是char数组,请使用strdup将字符串复制到新分配的内存块(并记住将其从结构中独立释放)。 E.g。

new_node->name = strdup(etiq);

或者将结构中的name定义为char name[100],然后使用strcpy或直接将name传递给fscanf