0

ユーザー入力から文を取得し、それをリンクされたリストに保存するプログラムを作成しようとしています。これは私がこれまで行ってきたことであり、リストを印刷すると文字列が印刷され、「ガベージ」を印刷する無限ループに入る以外は機能しているようです。どこが間違っているか分かりますか?

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

#define STRLENGTH 100

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

int
main(void) {
   char str[STRLENGTH];
   printf("Enter a string: ");
   gets(str);

   node *linkedList = NULL;
   node *head = NULL;
   node *pre = NULL;

   int i;
   for(i = 0; str[i] != '\0'; i++) {
      linkedList = malloc(sizeof(node));
      if(str[i] == ' ')
         linkedList -> data = 0;
      else
         linkedList -> data = str[i];

      if(pre != NULL)
         pre -> next = linkedList;
      else
         head = linkedList;
      pre = linkedList;
   }

   while(head != NULL) {
      printf("%c", head -> data);
      head = head -> next;
   }

   return 0;
}
4

2 に答える 2

2

を初期化するのを忘れたlinkedList -> nextため、ガベージ値があり、必ずしも ではありませんNULL。したがって、whileループはそれをたどろうとし、( が指す) ランダムなメモリ アドレスにアクセスし、未定義の動作head -> nextを引き起こします。

補遺では、使用しないでくださいgets。オーバーフローから保護されません。fgets代わりに使用してください。

于 2013-10-30T01:01:45.953 に答える
0

あなたのバグは、for ループの最後の繰り返しでのみ発生します。linkedList の最後の要素の次のポインタを初期化していません。

実行している操作の数を最小限に抑えたい場合。for ループの実行後、while ループの add の前

pre->next = NULL;

pre が最終ノードを指すことがわかっているためです。この方法では、ループの繰り返しごとに実行する必要はありません。

于 2013-10-30T01:02:40.273 に答える