簡體   English   中英

遍歷數組

[英]c iterate over an array

我的代碼存在一些問題,我讀取了一個文件,並將文件中的數據推入結構數據類型

但是當遍歷應該是結構數組的dataValue時,它會給我相同的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,name

您的代碼使用的是未初始化的指針dval ,並且在打印之前為它分配了超出范圍的局部變量的地址。 這不是在C中創建數組的方法。

您可以使用malloc將數組分配到dval ,但隨后您還必須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)

您的struct包含一個指向double double *dval的指針。 看來您打算將其用作4個雙精度數組。 但是您沒有為4個雙打分配內存。 推薦的在struct存儲4個double的方法是在其中定義一個數組。

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

有一個類似的問題與name 您可以在while循環外分配一次100字節的內存,並獲得一個名為etiq的指針。 然后,對於dataValue每個元素,將name設置為相同的指針etiq ,即使用fscanf覆蓋的同一塊。 如果要在struct使用char*而不是char數組,請使用strdup將字符串復制到新分配的內存塊中(並記住將其獨立於結構釋放)。 例如

new_node->name = strdup(etiq);

或定義name中的結構作為char name[100]要么使用strcpy或通過name直接fscanf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM