所以我试图创建一个textbuffer,它将给定文本的行存储到一个列表中我目前正在编写一个交换函数,但是如果我尝试调整某些行,就会出现分段错误。
这是我正在使用的当前交换函数:

void swapTB (TB tb, int pos1, int pos2) {

if (tb == NULL) {
    abort();
}

if (pos1 < 0 || pos1>tb->size || pos2<0 || pos2>tb->size) {
    printf("error: lines are out of range!\n");
    abort();
}

link line1 = findLine(tb, pos1);
link line2 = findLine(tb, pos2);

char *temp = (char *)malloc((strlen(line1->line) + 1) * sizeof(char));
strcpy(temp,line1->line);
strcpy(line1->line, line2->line);
strcpy(line2->line,temp);

free(temp);

}

如果我尝试输入此文本:
char text[] = "0. She walks in beauty, like the night\n"
              "1. Of cloudless climes and starry skies;\n"
              "2. And all that’s best of dark and bright\n"
              "3. Meet in her aspect and her eyes;\n"
              "4. Thus mellowed to that tender light\n"
              "5. Which heaven to gaudy day denies.\n"
              "6. One shade the more, one ray the less,\n"
              "7. Had half impaired the nameless grace\n"
              "8. Which waves in every raven tress,\n"
              "9. Or softly lightens o’er her face;\n"
              "10. Where thoughts serenely sweet express,\n";

并执行以下交换:
swapTB(tb, 4, 7);
swapTB(tb, 2, 9);
swapTB(tb, 2, 10);

它工作得很好,我得到这个输出:
0. She walks in beauty, like the night
1. Of cloudless climes and starry skies;
10. Where thoughts serenely sweet express,
3. Meet in her aspect and her eyes;
7. Had half impaired the nameless grace
5. Which heaven to gaudy day denies.
6. One shade the more, one ray the less,
4. Thus mellowed to that tender light
8. Which waves in every raven tress,
2. And all that’s best of dark and bright
9. Or softly lightens o’er her face;

但是,如果稍微更改文本,例如缩短第9行:
char text[] = "0. She walks in beauty, like the night\n"
              "1. Of cloudless climes and starry skies;\n"
              "2. And all that’s best of dark and bright\n"
              "3. Meet in her aspect and her eyes;\n"
              "4. Thus mellowed to that tender light\n"
              "5. Which heaven to gaudy day denies.\n"
              "6. One shade the more, one ray the less,\n"
              "7. Had half impaired the nameless grace\n"
              "8. Which waves in every raven tress,\n"
              "9. Or softly lightens o’er\n"
              "10. Where thoughts serenely sweet express,\n";

我有一个分割错误11。
这种情况一直在持续发生,有时它工作得很好,有时它出现分段错误,有时它运行,但最终的输出是重复的——这一切都取决于我给函数的文本。
文本存储在这样的结构中,顺便说一句:
typedef struct textNode *link;

struct textNode {
    char *line;
    link next;
};

struct textbuffer{
    link head;
    link last;
    int size;
};

编辑:
分配换行符的函数:
link newLine(char text[], int start, int i) {

    link newLine = malloc(sizeof(*newLine));
    assert(newLine != NULL);

    newLine->line = extract(text, start, i);
    //printf("newline is %s\n", newLine->line);
    newLine->next = NULL;

    return newLine;

}

提取函数
char* extract(const char* src, int start, int end) {

    return strndup(src + start, (end - start)+1);
}

函数到findLine
link findLine(TB tb, int pos) {

    link curr = tb->head;
    int index = 0;

    while (index != pos) {
        curr = curr->next;
        index++;
    }

    return curr;
}

最佳答案

必须正确编写交换操作而不是这个代码

char *temp = (char *)malloc((strlen(line1->line) + 1) * sizeof(char));
strcpy(temp,line1->line);
strcpy(line1->line, line2->line);
strcpy(line2->line,temp);

应该有
char *temp  = line1->line;
lin1->line  = line2->line;
line2->line = temp;

如您所见,不需要复制字符串本身交换指针就足够了。
考虑到将数据成员size定义为具有类型int没有任何意义,因此每次都要检查它是否小于零如果将大小定义为类型size_t

关于c - 尝试交换字符串内容时出现段故障11,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27578610/

10-08 22:04
查看更多