【发布时间】:2020-11-20 14:23:09
【问题描述】:
我有一个函数leerArch(),它读取包含学生信息的文件并返回指向structs t_alumno动态数组的指针。
但是当我进行调试时,除了 realloc 函数之外,似乎一切正常。指针*arrDin 只改变了一次就没有再改变。
当我打印我的动态数组时,我得到了元素的数量和学生 ID,但名字和姓氏只是我数组中每个元素的最后一个学生。
所以我怀疑我的 realloc 函数不能正常工作,因为经过多次调试并查看我的代码后,我找不到任何其他可能导致此问题的缺陷。
这是我的结构:
typedef struct alumno{
int nro_registro;
char *nombre;
char *apellido;
}t_alumno;
这是我的函数,它读取文件并返回struct alumno的动态数组:
t_alumno *leerArch(char *nomArch){
int r,i,legajo,j;
char c;
char *nombre = malloc(1);
char *apellido = malloc(1);
t_alumno *arrDin = malloc(sizeof(t_alumno));
//reading file
//rach line has: 123456,name,surname
FILE *arch = fopen(nomArch,"r");
r = fscanf(arch,"%d,",&legajo);
for (i=0; r!= EOF; i++){
//writing name in a string
c = fgetc(arch);
for(j=0; c!=',' && c != EOF; j++){
*(nombre+j) = c;
nombre = realloc(nombre,j+2);
c = fgetc(arch);
}
c = fgetc(arch);
*(nombre+j) = '\0';
//writing surname in a string
for(j=0; c != EOF && c!='\n'; j++){
*(apellido+j) = c;
apellido = realloc(apellido,j+2);
c = fgetc(arch);
}
*(apellido+j) = '\0';
//adding element to my array. I suspect this realloc doesn't work properly
(arrDin+i)->nro_registro = legajo;
(arrDin+i)->nombre = nombre;
(arrDin+i)->apellido = apellido;
arrDin = realloc(arrDin,(i+2)*sizeof(t_alumno));
r = fscanf(arch,"%d,",&legajo);
}
//adding an ending element
(arrDin+i)->nro_registro = 0;
(arrDin+i)->nombre = "void";
(arrDin+i)->apellido = "void";
fclose(arch);
return arrDin;
}
我的文件有:
170022,Juan,Rodriguez
170050,Maria,Perez
170125,Lorena,Ledesma
170245,Tomas,Garcia
当我打印这个数组时的输出是:
{170022,Tomas,Garcia}
{170050,Tomas,Garcia}
{170125,Tomas,Garcia}
{170245,Tomas,Garcia}
打印功能:
void imprimirArr(t_alumno *arrDin){
int i;
for(i=0; (arrDin+i)->nro_registro != 0; i++){
printf("\n{%d,%s,%s}",(arrDin+i)->nro_registro,(arrDin+i)->nombre,(arrDin+i)->apellido);
}
}
【问题讨论】:
-
您不是将字符串 data 复制到您的结构中,而是复制字符串 pointer 。您应该使用
strdup函数将字符串分配给您的结构成员,如this question 的答案中所述。 -
这能回答你的问题吗? char* value changing after use of fgets
-
谢谢你们。我从未与 strdup 合作过,所以我要确定一下。我自己意识到字符串指针中的值一直在变化和替换。
标签: arrays c file dynamic realloc