2013-08-17 4 views
0

Я писал программу, чтобы вернуть строку, содержащую конкатенацию всех строк в узлах связанного списка, до тех пор, пока общий размер конкатенированной строки не будет равен определенному числу байтов. Но значение переменной цикла становится мусором в последней итерации. Может ли кто-нибудь сказать мне, почему?переменная цикла показывает значение мусора

typedef struct li { 
    char *data; 
    int len;    //structure for the linked list 
    struct li *next; 
} node ; 

node *head; 


void create() 
{ 
    int i,n; 
    char num[100];    //the value of i when equal to n-1 becomes garbage 
            //of the proper n-1 
    node *temp; 
    printf("enter the number of nodes\n"); 
    scanf("%d",&n);    //supposed to create the list 
    printf("n=%d",n); 
    printf("enter the strings to be kept in the nodes\n"); 

    for(i=0;i<n;i++) { 

     if(i==0) { 
      head=(node*)malloc(sizeof(node)); 
      temp=head; 
     } 
     else { 
      temp->next=(node*)malloc(sizeof(node)); 
      temp=temp->next; 
     } 

     scanf("%s",num); 
     temp->data=num; 
     temp->len=strlen(num); 
     //in the final loop shows error as value of i becomes garbage 
    } 
    temp->next=NULL; 
} 


void g(int n) 
{ 
    int t=0,m;  //the main logic 
    char *f={'\0'}; 
    node *temp; 
    temp=head; 

    while(temp!=NULL && t!=n) { 
     m=sizeof(temp->data); 
     strcat(f,temp->data); 
     t+=m; 
     temp=temp->next; 
    } 

} 
+2

У вас есть утечка памяти. Когда выделен последний узел, вы все равно выделяете 'temp-> next', а затем просто присваиваете' NULL' 'temp-> next', не освобождая память. –

+0

В функции 'g()', вероятно, вам нужно использовать 'strlen (temp-> data)' вместо 'sizeof (temp-> data)', поскольку значение 'sizeof()' является константой времени компиляции, и вы 'конкатенирование строк переменной длины. Вам также нужно выделить хранилище для функции 'f' в функции, возможно, через' malloc() '. –

+0

Показать полный код! –

ответ

2

используется scanf для чтения строки от пользователя, и поместить его в локальном массиве. Первая проблема заключается в том, что вы делаете все указатель узла указателя на этот локальный массив. Вторая проблема заключается в том, что это переменная local, которая не будет действительна после возвращения функции.

Самый простой способ решить эту проблему - использовать функцию strdup для дублирования строки. Просто помните, что тогда вы должны free этот текст.

Смежные вопросы