我正在一个函数中读取。geo文件,将其内容保存在链表中。问题在于当我填充一个节点并必须创建另一个节点时,然后使下一个指针指向新节点。
函数调用一个空链表(ola),它的*next指针指向null。
#include <stdio.h>
#include <stdlib.h>
typedef struct cel{
char *nome;
char *borda;
char *meio;
double x;
double y;
double lar;
double alt;
struct cel * next;
} celula;
void ler(celula * ola){
celula * aux = ola;
char comando[30];
char borda[20] = "transparent";
char meio[20] = "transparent";
FILE *fp;
fp = fopen("c-rects.geo", "r");
int b;
double i;
for (b=0; b<50;b++){
fscanf(fp, "%s", comando);
if(!strcmp(comando, "nx")){
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
}
else if(!strcmp(comando, "r")){
fscanf(fp, "%s", aux->nome);
aux->borda = borda;
aux->meio = meio;
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->y);
fscanf(fp, "%lf", &aux->lar);
fscanf(fp, "%lf", &aux->alt);
}
else if(!strcmp(comando, "cc")){
fscanf(fp, "%s", meio);
}
else if(!strcmp(comando, "cp")){
fscanf(fp, "%s", borda);
}
aux->next = (celula *) malloc(sizeof(celula));
aux = aux->next;
aux->next = NULL;
}
}
示例输入:
nx 110 1000 1000 1000 1000
cp tan cc gold
r r_269.00-686.00-1.0-15.0 269.000000 686.000000 1.000000 15.000000
名称应为r_269.00-686.00-1.0-15.0
Borda:黄金
Meio:棕褐色
X: 269.000000Y:
686.000000守护神:1.000000
alt: 15.000000
应该可以正常工作,不知道为什么只有在这种情况下它不能工作。
可能有几个问题。但是并不是所有的代码都显示出来,main丢失了。代码中典型的主要问题
表示没有分配内存。确保正确分配内存给指针(malloc
)。注意:ler
子程序中为局部变量分配的内存在ler
子程序剩余后会丢失。也要注意为结构cel
分配内存,例如在main例程中。您需要遍历整个代码来检查这一点。(然后您还可以阅读有关空闲内存的信息,但这里可能不需要它,命令free
)
一个可能的步骤如下所示:cel
已经包括nome
,borda
和meio
的内存。但这还不是全部,您需要真正理解问题并在整个代码中修复它。
typedef struct cel{
char nome[30];
char borda[30];
char meio[30];
double x;
double y;
double lar;
double alt;
struct cel *next;
} celula;
有一些问题…
meio
和borda
是函数作用域变量。当将它们设置为celula
实例时,我们需要使用strdup
。
同理,对于nome
。
我们可以把这些尺寸做大一点。
仅为r
命令分配malloc
实例。否则,会有大量的空/垃圾项。
最好让ler
分配并返回一个指向链表的指针,所以我们应该改变原型。
ler
中,我们需要fclose(fp)
下面是一些重构的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct cel {
char *nome;
char *borda;
char *meio;
double x;
double y;
double lar;
double alt;
struct cel *next;
} celula;
celula *
ler(void)
{
celula *ola = NULL;
celula *prev = NULL;
celula *aux = NULL;
char comando[30];
char borda[200] = "transparent";
char meio[200] = "transparent";
char nome[200];
FILE *fp;
fp = fopen("c-rects.geo", "r");
int b;
double i;
for (b = 0; b < 50; b++) {
if (fscanf(fp, "%s", comando) != 1)
break;
if (!strcmp(comando, "nx")) {
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
fscanf(fp, "%lf", &i);
}
else if (!strcmp(comando, "r")) {
prev = aux;
aux = malloc(sizeof(*aux));
aux->next = NULL;
if (ola == NULL)
ola = aux;
if (prev != NULL)
prev->next = aux;
aux->borda = strdup(borda);
aux->meio = strdup(meio);
fscanf(fp, "%s", nome);
aux->nome = strdup(nome);
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->x);
fscanf(fp, "%lf", &aux->y);
fscanf(fp, "%lf", &aux->lar);
fscanf(fp, "%lf", &aux->alt);
}
else if (!strcmp(comando, "cc")) {
fscanf(fp, "%s", meio);
}
else if (!strcmp(comando, "cp")) {
fscanf(fp, "%s", borda);
}
}
fclose(fp);
return ola;
}