c - C 排序程序中的段错误

标签 c sorting segmentation-fault

我正在用 C 语言开发一个函数,可以围绕给定的键对文本进行排序。 假设您有以下文件:

this line is first
but this line is second
finally there is this line

如果您运行该程序并将此文件作为输入,它应该打印:

but this line is second
finally there is this line
this line is first

因为but按字母顺序排列在finally之前。

但是,如果您传入一个标志来对不同的键进行排序,您将得到不同的输出。例如,如果您对此文件调用 fastsort -2,您应该得到:

this line is first
finally there is this line
but this line is second

因为 line 出现在 there 出现在 this 之前。是的,我假设 -2 表示每行中的第二个单词(就像大多数人一样,除了总是想从 0 开始的计算机科学家)。

此外,如果输入文件的特定行上不存在指定的键,我应该只使用该行的最后一个单词作为键。例如,如果用户想要对第 4 个单词( -4 )进行排序,并且排序遇到这样的行( sample line ),则排序应使用单词 line strong> 对该行进行排序。

我的问题来自最后一个假设,我使用 strtok() 来提取键给出的单词,但如果键大于行中的单词数,则会出现段错误。这是函数的主体;

 typedef struct {
     char word[128];
     int index;
 } wordIndex;

char** fastsort(char** text, int word){

char** sortedText;
char* LineAux;
int i;
wordIndex tokenLines[numLines];

for(i=0; i<numLines; i++){
    char* token;
    int j = 0; //counter

    LineAux = (char*) malloc(MAX_LENGTH*sizeof(char)); //MAX_LENGTH = 128
    if (LineAux==NULL){
        fprintf(stderr,"Error, malloc failed");
        exit(1);
    }

    strcpy(LineAux,text[i]);

    token = strtok(LineAux, " \n");
    j++;

    if(token == NULL){ //if blank line
        token=" ";

    } else {

        while(token != NULL){  //segmentation fault
            if(j == word){
                break;
            }
            token = strtok(NULL, " \n");
            j++;

        }
    }

    strcpy(tokenLines[i].word,token);
    tokenLines[i].index=i;
    free(LineAux); //free Aux string
    printf("token: %s   Line: %d  \n",tokenLines[i].word, tokenLines[i].index);
}

qsort(tokenLines,numLines,sizeof(wordIndex),compareTo); //sorting tokens

sortedText = (char**) malloc(numLines*sizeof(char*));
if (sortedText==NULL){
    fprintf(stderr,"Error, malloc failed");
    exit(1);
}


//reordering text
int n; 
for (n=0; n<numLines; n++){
    int index;

    sortedText[n]=(char*) malloc(MAX_LENGHT*sizeof(char));

    if (sortedText[n]==NULL){
        fprintf(stderr,"Error, malloc failed");
        exit(1);
    }

    index = tokenLines[n].index;
    strcpy(sortedText[n],text[index]);

}


return sortedText;

}

段错误出现在 while 循环内。 希望您能帮忙,先谢谢您。

最佳答案

我在我的机器上运行了上面的代码。它确实有效,但有一点需要注意: word 是 1 索引的,而不是您可能期望的 0,因为 j 在与任何内容进行比较之前都会递增。因此,如果您输入 0(如果您想按第一个单词排序,您自然会这样做),则这一行永远不会成立:

if(j == word){

因此,您的 while 循环将继续,直到 token 为 NULL。然后,在循环之后,您的 strcpy 崩溃,因为它试图遵循您传递给它的空指针:

strcpy(tokenLines[i].word,token); // don't NULL me bro!

这是您崩溃的根源。为了解决这个问题,我会进行两项更改:

  1. 去掉循环之前的j++。让索引从 0 开始,因为这是 C 语言中通常所做的事情,也是该函数的用户通常所期望的。

  2. 循环结束后,测试token是否为NULL。如果是,请优雅地退出该函数,可能会向用户返回某种错误。如果有人输入无效的字数就会崩溃,这是糟糕的用户界面。

关于c - C 排序程序中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46634827/

相关文章:

c - 我正在尝试用 C 编写程序以将 DS1302 RTC 与 PIC16F877a 一起使用

C 内存分配(malloc)

c - 从文件中读取并存储到缓冲区

java - 为什么我的 JTable 对整数列的排序不正确?

c - 根据元音编号对字符串中的单词进行排序

有人可以解释为什么这会出现段错误(C 编程)吗?

c - 编译器如何在中等内存模型中解析地址?

java - 发现需要 : T[],:T[]

c - 分段故障

c - 将十六进制值存储到寄存器时出现段错误