[英]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.