2017-01-31 17 views
1

Cでストリングのスタックを作成しようとしていますが、問題が発生しているようです。目標は、ファイルを読み取り、それを逆に印刷することです。私はスタックがこれを行う最も適切な方法であると決めました(私はこれを行う簡単な方法があることを認識していますが、構造の使用について自分自身に挑戦したい)。ここで Cストリングの問題

は私のプッシュ/ printStackコードです:

void push(struct LineStack * stack, char * line) 
{ 
    if(!stack->head) 
    { 
     stack->head = malloc(sizeof(struct entry *)); 
     stack->head->data = line; 
     stack->head->next = NULL; 
     stack->top = stack->head->data; 
     stack->size++; 
    } 
    else 
    { 
     struct entry * entry = malloc(sizeof(struct entry *)); 
     entry->data = line; 
     entry->next = stack->head; 
     stack->head = entry; 
     stack->top = stack->head->data; 
     stack->size++; 
    } 
}                             

void printStack(struct LineStack * stack) 
{ 
    while(stack->head) 
    { 
     printf("%s\n", stack->head->data); 
     stack->head = stack->head->next; 
    } 
} 

そしてここtempFile.txt /メインです:

int main(void) 
{ 
    struct LineStack * stack = newStack(); 
    char * fileName = "tempFile.txt" 
    char line[SIZE]; 

    FILE * fp = fopen(fileName, "r"); 

    while(fgets(line, 128, fp) != NULL) 
     push(stack, line); 

    printStack(stack); 

    free(stack); 

    return 0; 
} 

tempFile.txt:

Lets begin 
We'll say 2 + 2 = 4 
But then go ahead and prove that 1 + 2 + 3 + 4 + ... = -1/12 
How can this be? 
How can this be? 

私がしようコードを実行すると、ファイル(5)の正しい行数が出力されますが、「どうすればよいのか」が表示されます。さて、私はGDBを使って問題が何かを確認しようとしました。プッシュ呼び出しが適切に機能しているようです。それぞれの呼び出しは異なるメモリ位置に異なる行を置くので、スタックを構成するリンクリストが正常に動作していると仮定する必要があります。私は何か愚かで小さなものを逃していますか?事前に

struct entry 
{ 
    char * data; 
    struct entry * next; 
}; 

struct LineStack 
{ 
    struct entry * head; 
    char * top; 
    int size; 
}; 

ありがとう:

は参考のため、ここではエントリー/ LineStackの宣言です。

+0

どこが 'newStack()'ですか? –

+0

newStack()とSIZEは定義されていません。 – BlueCollar

+1

'push()'関数で大文字と小文字の重複を除いて、大部分は避けるべきです。 –

答えて

0

main()は、各行をローカル配列lineに読み込みます。次に、この配列へのポインタ(ポインタ)を関数push()に渡します。その関数は単純にこのポインタをスタックに格納します。データはコピーされず、ポインタだけがコピーされます。その結果、すべてのスタックエントリに同じ配列へのポインタが含まれます。あなたがそれらを印刷するとき、この配列はファイルから読み込まれた最後の行を含み、それはあなたが行を読むのと同じ回数だけ印刷します。

入力文字列をコピーする必要があります。 strdup()(標準のC言語ではないPOSIX関数)をお持ちの場合は、そのようなコピーを作成する最も簡単な方法です。それ以外の場合は、[strlen()+] malloc() + strcpy()の文字列をコピーする従来の方法になります。どちらの方法でも、最後のポインタを失う前に、動的に割り当てられた各メモリを解放した後に、そのメモリを解放する必要があります。ここで

stack->head = malloc(sizeof(struct entry *)); 

は、あなたがポインタのサイズstruct entrystruct entry自体のないサイズにメモリのチャンクを割り当てる:

+0

親切にありがとう:)。これは完全に機能しました。 –

0

別に@JohnBollingerはすでに言ったから、次のような問題を抱えています。それは次のようになります。

stack->head = malloc(sizeof(struct entry)); 

あなたがstack->entryにメモリを割り当てるときに、同じ問題が起こります。