2013-12-16 47 views
-2

当我编译它时,它有段错误C /链表/如何解决分段错误?

strcat(arr, cur->texts);这是dumpTB函数。

在主要功能,当dumpTB函数被调用,它应该打印出像

hello\ngood bye\nworld\n同我在newTB功能键入..

任何人都可以找出问题是什么?


我添加了函数deleteTB(TB tb,int from,int to)。 我不只是问'你能为我做这个吗?',我想知道并学习如何解决。 我试过从昨晚..但仍然卡住..

奇怪的是,我在同一行'strcat(arr,cur->文本)'有seg错误。我试图修改不同的方式和代码,但不知道。

由于我的输入是类似 “你好\ ngood再见\ nworld \ n” 个..

当deleteTB(列表,0,1)被称为像这样,//(头节点是0)

printbuffer(清单)应打印像,

POS 0:世界

然后,dumpTB(清单)应打印像,

世界。


因为我不知道这里的规则,昨晚我发布了几乎同样的东西,这让人很烦恼。对不起。我不只是要求你们这样做。我真的很想学习。


#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#include "textbuffer.h" 

#define MAX_TEXT 256 

struct textbuffer { 
    char *texts; 
    int count; 
    TB next; 
}; 

TB newTB (char text[]){ 
    TB newText = malloc(sizeof(struct textbuffer)); 
    char *cpy = (char *)malloc(MAX_TEXT * sizeof(char)); 
    TB head = newText; // Store the first node to return 

    strcpy(cpy,text); 
    newText->count = 0; 
    newText->next = NULL; 
    int i = 0; 
    int j = 0; 

    while(cpy[i] != '\0') { 
     if(j == 0) { 
      head->texts = (char *)malloc(MAX_TEXT * sizeof(char)); 
     } 
     if(cpy[i] == '\n') { 
      head->texts[j] = '\0'; 
      newText->count++; 
      head->next = malloc(sizeof(struct textbuffer)); 
      head = head->next; 
      j = 0; 
      i++; 
     } else { 
      head->texts[j++] = cpy[i++]; 
     } 
    } 
    head->next = NULL; 
    return newText; 
} 

void releaseTB (TB tb) { 
    TB head = tb; 
    TB tmp; 

    while(head != NULL) { 
     tmp = head; 
     head = head->next; 
     free(tmp->texts); 
     free(tmp); 

    } 
} 

char *dumpTB (TB tb) { 
    if(tb == NULL) { 
     return NULL; 
    } 
    TB cur = tb; 
    char *arr = (char *)malloc(MAX_TEXT * sizeof(char)); 

    while(cur != NULL) { 
     if(arr == NULL) { 
      strcpy(arr,""); 
     } 
     strcat(arr, cur->texts); 
     if(cur->next != NULL) { 
      strcat(arr, "\n"); 
     } 
     cur = cur->next; 
    } 
    return (arr); 
} 

int linesTB(TB tb) { 
    return (tb->count); 
} 

void printBuffer(TB tb){ 
    TB curr = tb; 
    int i=0; 
    while(curr->next != NULL){ 
     printf("POS %d : %s\n", i++, curr->texts); 
     curr = curr->next; 
    } 
} 

void swapTB(TB tb, int pos1, int pos2) { 
    if((pos1 < 0) || (pos2 < 0) || (pos1 > linesTB(tb)-1) || (pos2 > linesTB(tb)-1)) { 
     printf("**GIVEN LINES ARE OUT OF RANGE**\n"); 
     abort(); 
    } 
    TB cur = tb; 
    TB head = tb; 
    int i = 0; 

    char *tmp = (char *)malloc(MAX_TEXT * sizeof(char)); 
    tb->texts = cur->texts; 
    while(i < pos1) { 
     cur = cur->next; 
     i++; 
    } 
    strcpy(tmp, cur->texts); 
    cur->texts = NULL; 
    i=0; 
    while(i < pos2) { 
     head = head->next; 
     i++; 
    } 
    cur->texts = head->texts; 
    head->texts = tmp; 
} 

void deleteTB(TB tb, int from, int to) { 
    if((from < 0) || (to < 0) || (from > linesTB(tb)-1) || (to > linesTB(tb)-1)) { 
     printf("**GIVEN LINES ARE OUT OF RANGE**\n"); 
     abort(); 
    } 
    TB cur = tb; 

    int i = 0; 

    for(i = 0; i < from; i++) { 
     cur = cur->next; 
    } 
    while(i <= to) { 
     cur->texts = '\0'; 
     free(cur->texts); 
     //free(cur); 
     cur = cur->next; 
     i++; 
    } 
} 

int main(int argc, char * argv[]) { 
    TB list = NULL; 
    list = newTB("hello\ngood bye\nworld\n"); 

    printf("**THERE ARE %d LINES IN TEXTBUFFER**\n", linesTB(list)); 
    printBuffer(list); 
    printf("**Dumping test**\n"); 
    printf("%s\n",dumpTB(list)); 

    printf("**Swapping test**\n"); 
    swapTB(list, 0, 1); 
    printBuffer(list); 

    printf("**Deleteing test**\n"); 
    deleteTB(list, 1, 1); 
    printBuffer(list); 
    printf("%s\n",dumpTB(list)); 


    releaseTB(list); 

    return 0; 
} 
+0

执行调试立竿见影。 –

+0

结核病是什么?并且[不要投出malloc的回报](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。并且还使用'strdup()'... – Eregrith

+0

在dumpTB函数中使用strdup()作为arr ?! –

回答

0

您使用strcat功能。并且第一个参数是arr,它不是空终止的。 因此,使用,下面的代码使用strcat

arr[0]='\0'; 

而且之前,在这样的循环检查cur->next

while(cur->next != NULL) 

此外,您releaseTB会给你segfault对上面说的原因。 循环条件更改为

while(head->next != NULL) 

编辑

char *dumpTB (TB tb) { 
    if(tb == NULL) { 
     return NULL; 
    } 
    TB cur = tb; 
    char *arr = (char *)malloc(MAX_TEXT * sizeof(char)); //VS throws error if we wont cast 
    arr[0]='\0'; // Null Terminated 
    while(cur->next != NULL) { // changed to cur->next 
     if(arr == NULL) { 
      strcpy(arr,""); 
     } 
     strcat(arr, cur->texts); 
     if(cur->next != NULL) { 
      strcat(arr, "\n"); 
     } 
     cur = cur->next; 
    } 
    return (arr); 
} 

void releaseTB (TB tb) { 
    TB head = tb; 
    TB tmp; 

    while(head->next != NULL) { // Changed to head->next 
     tmp = head; 
     head = head->next; 
     free(tmp->texts); 
     free(tmp); 

    } 
} 
+0

我试着像你说的..但仍然无法正常工作..顺便说一句,对于循环部分,如果我改变while(cur-> next!= NULL),它不会打印出任何东西 –

+0

将发布我编译的代码VS ... – 2013-12-16 12:09:38

+0

它似乎有点工作..你怎么能确定哪一部分是错误的,只要你看到代码..惊人 –