簡體   English   中英

strcmp() 段錯誤,不知道為什么?

[英]strcmp() segfaults, no idea why?

我正在為大學做分配,這是我需要實施的最后一個 function。 請原諒我使用另一種語言,但我相信它幾乎沒有提供任何背景信息。 它應該從另一個文件中獲取信息,並使用圖表更新原始文件,其中包含有關航班和座位的數據。 我的問題是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 有關,但我不知道為什么,因為打印不起作用。

這有一些問題,但我認為問題在於從文件中讀取的字符串上沒有 null 終止符。 strcmpstrcpy旨在處理具有尾隨 null 終止符的字符串,即'\0' 您的 memory 緩沖區沒有這個。 所以我建議使用memcmpmemcpy代替,這允許您設置 memory 大小(在本例中為 20)。

您可以做的另一件事是通過將緩沖區大小更改為 21 並將buffer[20]的值設置為'\0'來強制 null 終止符到字符串的末尾。 我建議不要這樣做,因為如果從文件中讀取的字節數不完全是 20,它將失敗。

編輯:但由於這是 c++ 只需使用文件流和std::string讓您的生活更輕松。 不要亂用舊的 c 程序,除非你必須(或真的知道你在做什么)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM