首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C排序程序中的故障分割

C排序程序中的故障分割
EN

Stack Overflow用户
提问于 2017-10-08 18:49:43
回答 2查看 48关注 0票数 0

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

代码语言:javascript
复制
this line is first
but this line is second
finally there is this line

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

代码语言:javascript
复制
but this line is second
finally there is this line
this line is first

因为最后是按字母顺序在这之前。

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

代码语言:javascript
复制
this line is first
finally there is this line
but this line is second

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

此外,如果在输入文件的特定行中不存在指定的键,我应该使用该行的最后一个字作为键。例如,如果用户希望在第四个单词( -4 )上排序,而排序遇到这样的一行(示例行 ),那么排序应该使用单词 line 来排序。

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

代码语言:javascript
复制
 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循环中。希望你能帮上忙,谢谢提前。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-08 19:25:16

我在我的机器上运行了上面的代码。它可以工作,但有一个警告;word是1索引的,而不是您可能预期的0,因为j在与任何东西比较之前都是递增的。因此,如果您输入0,就像您想按第一个单词排序一样,这一行永远不会是真的:

代码语言:javascript
复制
if(j == word){

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

代码语言:javascript
复制
strcpy(tokenLines[i].word,token); // don't NULL me bro!

这就是你坠机的原因。为了解决这个问题,我要做两个改变:

  1. 在循环之前去掉j++。让索引从0开始,因为这通常是C语言所做的,也是函数的用户通常期望的。
  2. 循环结束后,测试token,看看它是否是NULL。如果是的话,优雅地退出函数,可能会向用户返回某种错误。如果有人输入一个无效的字号就会崩溃,这是一个糟糕的UI。
票数 1
EN

Stack Overflow用户

发布于 2017-10-08 19:16:24

阿莱斯特,我有办法;

问题在于while循环中指令的顺序。

以下是工作解决方案:

代码语言:javascript
复制
/**
 * Function that sorts text by a given key
 * @param text: array of strings which is going to be sorted
 * @param word: key where the sort starts
 * @return sorted text
 */
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_LENGHT*sizeof(char));
        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
                strcpy(tokenLines[i].word,token);
                if(j == word){
                    break;
                }

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

            }
        }

        tokenLines[i].index=i;
        free(LineAux); //free Aux string
    }

正如您所看到的,这个更改并不是非常有效,但它目前确实有效,如果您有一个替代解决方案,我很乐意尝试它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46634827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档