2017-12-04 8 views
0
#include <stdio.h> 
#include <stdlib.h> 

#define MAXLINE 80 

typedef struct Node{ 
    char *data; 
    struct Node *next; 
}Node; 

int get_Line(FILE *fp, char s[], int lim); 
Node* addNode(Node *front, char *data); 
Node* fillList(Node *front, char *txtFile, int lim); 

int main() { 
    Node *dataFront = NULL; 
    dataFront = fillList(dataFront,"data.txt",MAXLINE); 
    printf("%s\n",dataFront->data); //prints blank line 
    return 0; 
} 

int get_Line(FILE *fp, char s[], int lim){ 
    int c, i; 
    for (i = 0; i < lim-1 && (c=getc(fp)) != EOF && c != '\n'; ++i) 
     s[i] = c; 
    if (c == '\n'){ 
     s[i] = c; 
     ++i; 
    } 
    s[i] = '\0'; 
    return i; 
} 

Node* addNode(Node *front, char *data){ 
    Node *newNode = (Node*)malloc(sizeof(Node)); 
    newNode->data = data; 
    newNode->next = NULL; 
    if(front!= NULL) 
     newNode->next = front; 
    front = newNode; 
    return front; 
} 

Node* fillList(Node *front, char *txtFile, int lim){ 
    FILE *fp = fopen(txtFile,"r"); 
    char data[lim]; 
    while(get_Line(fp,data,lim) > 0){ 
     front = addNode(front, data); 
     printf("%s\n",front->data); //prints the string member of Node 
            //front just fine 
    } 
    printf("%s\n",front->data); //prints blank line 
    fclose(fp); 
    return front; 
} 

私は、テキストファイルから行を読み取って文字列を含むノードのリストを作成しています。テキストファイルは何でもかまいません。私のノードのStringメンバーは、作成後に空白行を印刷するのはなぜですか?

printステートメントをfillList関数に入れて、デバッグに役立てます。関数fillListのprint-> whileループ内のデータは機能しますが、whileループの外側では空白行が出力されます。メイン印刷では、文字列メンバも空白行を与えます。私はこれを修正するための助けが必要です。オフの私のデバッグget_LineとaddNodeうまく動作します。

EDIT 1: 私のテキストファイル - data.txtをは - txt file screenshot - - 以下のテキストが含まれて私の出力は、このJPEGで見ることができます。 output screenshot

+0

あなたのプログラムの出力は?空白行の意味を正確にはわかりません。データの前、後、に来るのでしょうか?それとも唯一のものが印刷されているのでしょうか?プログラムの出力を含めるように質問を更新する必要があります。 –

+0

あなたのファイルは本当にありません;最後に2つの '\ n'が含まれていますか?また、あなたのコードに**大きな**問題があります。 – coderredoc

+1

'newNode-> data = strdup(data)'はいくつかのUBを修正します – pm100

答えて

2

問題は、あなたのaddNode機能であります:ここ

newNode->data = data; 

は、dataパラメータは、で定義されたdataアレイに対応しますfillList。したがって、各リスト要素のdataメンバは、の配列をfillListに返します。つまり、すべてのリスト要素に同じデータが含まれています。 whileループを終了すると、dataに空の文字列が含まれます。そして、すべてのノードdataメンバはローカルdata配列を指しているので、front-dataを印刷すると空の文字列が得られます。

さらに悪いことに、fillListから戻ると、リスト要素は現在スコープ外のローカル変数を指しています。 printfmainから呼び出すときに、その無効なポインタを逆参照することによってundefined behaviorを呼び出します。 mainから印刷するときに表示される空白行は、その無効なメモリ位置にあるものであり、一貫性を保つためにそのビアビオールに依存することはできません。

これを解決するには、各リスト要素に新しいバッファを割り当て、そのバッファに文字列をコピーします。あなたはstrdupを使用して一度に両方の操作を行うことができます。

newNode->data = strdup(data); 

また、あなたはあなたのプログラムがリスト内のノードとそれらに含まれる文字列の両方を解放する終了するときにコードを追加したいと思うので、あなたがメモリリークを持っていません。

+0

ありがとう!私はあなたの修正を試して、それは動作します。 –

+0

私は何が起こっているのか分かりません。OPからこの種の行動を取るのは非常に奇妙です。 OPスイッチをもう一度押すと、回答が削除されます。 – coderredoc

+0

このOPの動作は本当に奇妙です。私はOPが選択解除されると答えを削除します。 +1は良い答えです。 – coderredoc

関連する問題