[英]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 終止符。 strcmp
和strcpy
旨在處理具有尾隨 null 終止符的字符串,即'\0'
。 您的 memory 緩沖區沒有這個。 所以我建議使用memcmp
和memcpy
代替,這允許您設置 memory 大小(在本例中為 20)。
您可以做的另一件事是通過將緩沖區大小更改為 21 並將buffer[20]
的值設置為'\0'
來強制 null 終止符到字符串的末尾。 我建議不要這樣做,因為如果從文件中讀取的字節數不完全是 20,它將失敗。
編輯:但由於這是 c++ 只需使用文件流和std::string
讓您的生活更輕松。 不要亂用舊的 c 程序,除非你必須(或真的知道你在做什么)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.