strcmp() 段错误,不知道为什么?

时间:2021-06-03 16:21:40

标签: c

我正在为大学做一个作业,这是我需要实现的最后一个功能。请原谅我使用另一种语言,但我相信它提供的上下文很少。它应该从另一个文件中获取信息,并使用图表更新包含航班和座位数据的原始文件。我的问题是 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 有关,但我不知道为什么,因为打印不起作用。

1 个答案:

答案 0 :(得分:1)

这有一些问题,但我认为问题在于从文件中读取的字符串中没有空终止符。 strcmpstrcpy 旨在处理具有尾随空终止符(也称为 '\0')的字符串。你的内存缓冲区没有这个。因此,我建议您改用 memcmpmemcpy,它们允许您设置内存大小(在本例中为 20)。

您可以做的另一件事是通过将缓冲区大小更改为 21 并将 buffer[20] 的值设置为 '\0' 来强制在字符串末尾添加空终止符。不过我建议不要这样做,因为如果从文件中读取的字节数不是 20,它就会失败。

编辑:但由于这是 C++,因此只需使用文件流和 std::string 即可让您的生活更轻松。除非必须(或真正知道自己在做什么),否则不要乱用旧的 c 程序。

相关问题