为什么这段代码只写第一个和最后一个出现的nome,cognome和cf?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct data{
char nome[20];
char cognome[20];
char cf[20];
}data;
void leggi_file(FILE *input, data **array, int *dim);
void aggiorna(data *vect, char *nome, char *cognome, char *cf, int dim);
void scrivi_file(FILE *output, data *vect, int dim);
int main(void){
FILE *input, *output;
input = fopen("prog1file.txt", "r");
output = fopen("prog1file2.txt", "w");
data *vect1;
int dim_vect1 = 0;
leggi_file(input,&vect1,&dim_vect1);
char *nome="Michele", *cognome="Nappi", *cf="nppmhl69p22b119f";
aggiorna(vect1, nome, cognome, cf, dim_vect1);
scrivi_file(output, vect1, dim_vect1);
return 0;
}
void leggi_file(FILE *input, data **array, int *dim){
char nome[20], cognome[20], cf[17];
int i;
while(fscanf(input, "%s %s %s", nome, cognome, cf) == 3)
(*dim)++;
*array = malloc((*dim + 1) * sizeof(data));
rewind(input);
for(i=0; i<(*dim); i++)
fscanf(input, "%s %s %s", array[i]->nome, array[i]->cognome, array[i]->cf);
}
void aggiorna(data *vect, char *nome, char *cognome, char *cf, int dim){
strcpy(vect[dim].nome, nome);
strcpy(vect[dim].cognome, cognome);
strcpy(vect[dim].cf, cf);
}
void scrivi_file(FILE *output, data *vect, int dim){
int i;
for(i=0; i<(dim+1); i++)
fprintf(output, "%s %s %s\n", vect[i].nome, vect[i].cognome, vect[i].cf);
}
它应该在第二个文件中写入存储在第一个文件中的nome,cognome和cf的出现,然后添加另一个从主文件传递过来的文件。为什么只写第一个和最后一个?
在输出文件中,我得到如下信息:
Giuseppe Nappo nppgspmhl65t23c126a
Michele Nappi nppmhl69p22b119f
答案 0 :(得分:3)
在leggi_file
函数中,array
是指向结构指针的指针。可以将其视为指向结构数组的指针。绝对不是一个指向结构的指针数组(如使用array[i]->nome
所示)。
正确的方法是取消引用指针以获取数组( 结构 ),如(*array)[i].nome
所示。
使用array[i]->nome
会将array
视为一个指针数组,而并非如此。它是(实际上但不是语义上的)指向数组的指针。
通过使用array[i]->nome
,您将超出array
的内存范围,导致undefined behavior。您很幸运(或视情况而定不幸)代码不会崩溃。
您只需更改以下一行:
fscanf(input, "%s %s %s", array[i]->nome, array[i]->cognome, array[i]->cf);
您应该更改为
fscanf(input, "%s %s %s", (*array)[i].nome, (*array)[i].cognome, (*array)[i].cf);