gpt4 book ai didi

c - 为什么这段代码只写了第一次和最后一次出现的 nome、cognome 和 cf?

转载 作者:太空宇宙 更新时间:2023-11-04 06:48:45 25 4
gpt4 key购买 nike

为什么这段代码只写了第一次和最后一次出现的 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 的出现写入第二个文件,然后添加另一个从 main 传递过来的。为什么只写第一个和最后一个?

在输出文件中我得到这样的东西:

Giuseppe Nappo nppgspmhl65t23c126a


Michele Nappi nppmhl69p22b119f

最佳答案

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);

关于c - 为什么这段代码只写了第一次和最后一次出现的 nome、cognome 和 cf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54456398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com