2016-03-20 9 views
0

入力ファイルを取り込んでそれから文字列を抽出してリンクリストに追加するプログラムがあります。私はリンクされたリストに文字列を正しく追加しているとは思わないし、正しい方法を見つけることができない。プログラムが実行されると何らかの理由で無限ループに入ります。リンクリストに文字列を挿入しようとすると正しく動作しない

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

struct list { 
    char *string; 
    struct list *next; 
}; 

typedef struct list LIST; 

int main() { 
    FILE *fp; 
    char line[128]; 
    char file_name[20]; 
    LIST *current, *head; 
    char *p, *s; 

    head = current = NULL; 
    printf ("Enter the name of the file: "); 
    scanf("%s",file_name); 

    fp = fopen(file_name, "r"); 

    while(fgets(line, sizeof(line), fp)) 
    { 
     p = s = line; 
     while(*p!=0) 
     { 
      if (*p==' ') 
      { 
       LIST *node = malloc(sizeof(LIST)); 
       *p = 0; 
       node->string = strdup(s); 
       node->next =NULL; 

       if(head == NULL){ 
       current = head = node; 
       } else { 
       current = current->next = node; 
       } 
       s = p+1; 
      } 

      p++; 
     } 
    } 
    fclose(fp); 
    //test print 
    for(current = head; current ; current=current->next){ 
     printf(" %s", current->string); 
    } 
    return 0; 
} 
+0

あなたはそれによって 'リンパ節転移> next'は'ノードに等しいループを作成し、ライン内のすべての単語に同じノードを使用しています'。新しい単語を挿入するときは新しいノードを作成し、新しい単語を読み込んだときは作成しないでください。 –

+1

デバッガを1行ずつ実行しているときに何を学習しますか? –

+0

@MOehmありがとうございます。上記のコードを変更して、単語を挿入するときに新しいノードが作成されるようにしました。無限ループの問題が修正されました。最後のものを除くテキストファイルのすべての単語が出力されるようになりました。リンクされたリストにファイルの最後の単語が保存されない理由を知っていますか? –

答えて

0

いくつかのこと:

  • あなたは、それによってnode->nextnodeに等しいループを作成し、ライン内のすべての単語に同じノードを使用しています。新しい単語を挿入するときは新しいノードを作成し、新しい単語を読み込んだときは作成しないでください。

  • 行の最後の単語をキャッチしません。 fgetsは末尾の改行文字を保持し、スペースを確認するだけでなく、それをチェックするという事実を利用することができます。 からisspaceを使用することも考えられます。

    また、ループ終了後までヌルターミネータのチェックを延期することもできます。スペースまたはヌル文字を読むときは、新しい単語を追加する必要があります。

  • 入力ファイルに連続する空白または空白文字が含まれている場合は、空の単語を挿入します。有効な単語のみを追加するには、プログラムでp > sをチェックする必要があります。 (あるいは、あなたのプログラムは、以前に読み込んだ文字がスペースでないときに有効な単語を追加するだけです)。ノードと文字列のメモリを割り当てます。プログラムを終了する前にこのメモリをfreeにする必要があります。

ここでは、上記の修正をあなたのメインループです:

while(fgets(line, sizeof(line), fp)) 
{ 
    char *p = line; 
    char *s = line; 

    do { 
     if (*p== ' ' || *p == '\n' || *p == '\t' || *p == '\0') { 
      if (p > s) { 
       LIST *node = malloc(sizeof(LIST)); 

       *p = 0; 
       node->string = strdup(s); 
       node->next = NULL; 

       if(head == NULL){ 
        head = node; 
       } else { 
        current->next = node; 
       } 
       current = node; 
      } 
      s = p + 1; 
     } 

     p++; 
    } 
    while (*p != 0); 
} 
+0

大変お世話になりました。私の入力ファイルの1つでは、最後の単語をスキップしました。 –

関連する問題