我正在为大学做一个作业,这是我需要实现的最后一个功能。请原谅我使用另一种语言,但我相信它提供的上下文很少。它应该从另一个文件中获取信息,并使用图表更新包含航班和座位数据的原始文件。我的问题是 strcmp。
aresta_grafo **atualiza_lugares(char *ficheiro, grafo *g, int *n)
{
if(!ficheiro||!g||!n) return NULL;
FILE* f=fopen(ficheiro,"r");
if(!f) return NULL;
char voo[20];
char codigo[20];
int lugares;
int k=0;
aresta_grafo** aresta_aux=(aresta_grafo**)malloc(sizeof(aresta_grafo*));
if (!aresta_aux) {
free(aresta_aux);
return NULL;
}
while(fgets(voo,20,f)!=NULL){
_Bool flag=0;
strcpy(codigo,strtok(voo,","));
printf("%s",voo);
lugares=atoi(strtok(NULL,","));
printf("%d",lugares);
for (int i = 0; i < g->tamanho; i++)
{
if(flag) break;
for (int j = 0; j < g->nos[i]->tamanho; j++)
{
if(flag) break;
if(strcmp(g->nos[i]->arestas[j]->codigo,codigo)==0){
if(lugares==0){
if(k!=0)
aresta_aux=realloc(aresta_aux,(k+1)*sizeof(aresta_grafo*));
aresta_aux[k]=g->nos[i]->arestas[j];
g->nos[i]->arestas[j]=NULL;
k++;
} else g->nos[i]->arestas[j]->lugares=lugares;
flag=1;
}
}
}
*n=k;
}
fclose(f);
我检查了其他线程,但我尝试了所有方法但仍然出现段错误,我怀疑这与 strtok 有关,但我不知道为什么,因为打印不起作用。
答案 0 :(得分:1)
这有一些问题,但我认为问题在于从文件中读取的字符串中没有空终止符。 strcmp
和 strcpy
旨在处理具有尾随空终止符(也称为 '\0'
)的字符串。你的内存缓冲区没有这个。因此,我建议您改用 memcmp
和 memcpy
,它们允许您设置内存大小(在本例中为 20)。
您可以做的另一件事是通过将缓冲区大小更改为 21 并将 buffer[20]
的值设置为 '\0'
来强制在字符串末尾添加空终止符。不过我建议不要这样做,因为如果从文件中读取的字节数不是 20,它就会失败。
编辑:但由于这是 C++,因此只需使用文件流和 std::string
即可让您的生活更轻松。除非必须(或真正知道自己在做什么),否则不要乱用旧的 c 程序。