0

リンクされたリストに文字列を保存するのに問題があります。これはリストにノードを挿入する関数です:

void insert_rec(rec_ptr *h_ptr, rec_ptr *t_ptr, int a, int b, int c, char* cs)
{   

    rec_ptr new_ptr;    
    new_ptr = rec_ptr( malloc( sizeof(REC) ) );

    if(new_ptr != NULL)
    {
        new_ptr->x    = a;
        new_ptr->y    = b;
        new_ptr->z    = c;
        new_ptr->c    = cs;
        new_ptr->next = NULL;

        if(*h_ptr == NULL){
            *h_ptr = new_ptr;
        }
        else{
            (*t_ptr)->next = new_ptr;
        }
        *t_ptr = new_ptr;
    }
    else
    {
        printf("%d %d %d not inserted. No memory available.\n",a,b,c);
    }
}

これは、出力ファイルから入力を読み取る関数です。としてリストに文字列を挿入していますchar*。はfscanf()文字列を正しく読み取りました。

void read_from_input2(rec_ptr & hptr, rec_ptr & tptr)
{  

    fp3=fopen("input2.txt","r");

    if (fp3 == NULL)
        printf("Error: Couldn't open file: input2.txt\n");
    else
    {
        while(!feof(fp3))
        {
            int x,y,z;
            char c1[10];
            fscanf(fp3,"%d",&x);
            fscanf(fp3,"%d",&y);
            fscanf(fp3,"%d",&z);
            fscanf(fp3,"%s",c1);
            char *c2 = c1;
            insert_rec(&hptr,&tptr,x,y,z,c2);
        }
    }
    fclose(fp3);
}

これは私が問題を抱えている機能です。リンクされたリストからデータを抽出すると、変数はc1ガベージを出力します。

void write_to_output2(rec_ptr hptr)
{   

    fp4=fopen("output2.txt","w");

    if (fp4 == NULL)
        printf("Error: Couldn't open file: output2.txt\n");
    else
    {
        if(hptr == NULL){
            printf("List is empty.\n\n");
        }
        else{
            while(hptr != NULL)
            {
                int x,y,z;
                char *c1,*c2;
                x  = hptr->x;
                y  = hptr->y;
                z  = hptr->z;
                c1 = hptr->c;
                c2 = get_class(x,y,z);
                fprintf(fp4,"%d %d %d %s %s\n",x,y,z,c1,c2);
                hptr = hptr->next;
            }
        }
    }
    fclose(fp4);
}

誰かが私のエラーを見ることができる場合は、私を助けてください。ありがとう。

4

1 に答える 1

1
char c1[10];
/* ... */
char *c2 = c1;
insert_rec(&hptr,&tptr,x,y,z,c2);

問題はc1のスタックにread_from_input2あり、その内容へのポインターを保存します。終了すると対象外となりwhile、アクセスが無効となります。

あなたはそれをしたいでしょうstrdup(または同等のもの)。

char *c2 = strdup(c1);

/* or */

new_ptr->c = strdup(cs);

そしていつか忘れないfreeでください。

于 2013-03-03T10:19:48.943 に答える