2016-10-21 22 views
-1

リンクリストから母音を削除する際に問題が発生しています。プログラムはコマンドライン引数を受け取り、それらを1つの文字列で結合し、リンクされたリストに各文字をノードとして追加します。リンクリストの最後のノードをリンクするとプログラムがクラッシュする

終了文字が母音ではないコマンドライン引数でプログラムを実行すると、プログラムは完全に機能します。しかし引数が母音で終わると、プログラムはメッセージセグメンテーションフォールト(コアダンプされた)でクラッシュします。私はこれをどのように扱うか考えません。

プログラムはグローバル変数を作成してはいけません。 stdio.h以外のヘッダファイルを使用してはいけません。stdlib.h

locateVowels()とremoveVowels()の間違いにより、この問題が発生する可能性があります。私は間違いが何であるか把握することができません。

この問題はダブルポインタを使用して解決できますか? 私はこのプログラムで何が間違っているのか理解できません。私はプログラミングの初心者です。このことで私を助けてください。私を訂正してください。 ありがとうございます。

完全なコードは以下のとおりである:

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

struct linkedList { 
    char ch; 
    struct linkedList *node; 
}; 
void printMenu(void); 
char* combineWithNoSpaces(int, char *[]); 
void addTolinkedList(char *, struct linkedList **, int *); 
void printLinkedList(struct linkedList **); 
struct linkedList *locateVowel(struct linkedList *s); 
int delHead(struct linkedList **); 
void removeVowels(struct linkedList *); 
int isEmpty(struct linkedList **); 
int isVowel(char); 
void freeLinkedList(struct linkedList *); 

int main(int argc, char *argv[]) { 
    int choice, indexer = 0; 
    struct linkedList *s; 
    char *string; 
    if (argc == 1) { 
     printf("Parse a sentence"); 
    } else { 
     s = (struct linkedList *) malloc(sizeof(struct linkedList)); 
     string = combineWithNoSpaces(argc, argv); 
     addTolinkedList(string, &s, &indexer); 
     while (1) { 
      printMenu(); 
      scanf("%d", &choice); 
      if (choice == 1) { 
       printLinkedList(&s); 
      } else if (choice == 2) { 
       if (!delHead(&s)) 
        printf("Failed.Empty linked list"); 
      } else if (choice == 3) { 
       removeVowels(s); 

      } else if (choice == 4) { 
       if (isEmpty(&s)) { 
        printf("Empty LinkedList"); 
       } else 
        printf("Not Empty"); 
      } else if (choice == 5) { 
       freeLinkedList(s); 
       break; 
      } else 
       printf("Invalic choice"); 
      printf("\n"); 
     } 
    } 
    return 0; 
} 
int isVowel(char ch) { 
    return (ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u' 
      || ch == 'A' || ch == 'E' || ch == 'I' || ch == 'O' || ch == 'U'); 
} 
void removeVowels(struct linkedList *s) { 

    s = locateVowel(s); 

    while (s != NULL) { 
     struct linkedList *temporary = s->node; 

     s->ch = temporary->ch; 
     s->node = temporary->node; 

     free(temporary); 

     s = locateVowel(s); 
    } 
} 
struct linkedList *locateVowel(struct linkedList *s) { 

    if (s == NULL) { 
     return s; 
    } 

    char ch = s->ch; 

    if (isVowel(ch)) { 
     return s; 
    } 

    if (s->node == NULL) { 
     return NULL; 
    } 

    return locateVowel(s->node); 
} 

int isEmpty(struct linkedList **s) { 
    if (*s == NULL) 
     return 1; 
    else 
     return 0; 
} 


int delHead(struct linkedList **s) { 
    struct linkedList *temp; 
    if ((*s) == NULL) { 
     return 0; 
    } else { 
     temp = (*s)->node; 
     free(*s); 
     *s = temp; 
     return 1; 
    } 
} 
void printLinkedList(struct linkedList **s) { 
    if ((*s) != NULL) { 
     printf("%c", (*s)->ch); 
     printLinkedList(&(*s)->node); 
    } 
    return; 
} 
void addTolinkedList(char *str, struct linkedList **s, int *indexer) { 
    if (*indexer == strlen(str)) { 
     *s = NULL; 
     return; 
    } else { 
     (*s)->ch = *(str + *indexer); 
     (*s)->node = (struct linkedList *) malloc(sizeof(struct linkedList)); 
     ++*indexer; 
     addTolinkedList(str, &(*s)->node, indexer); 
    } 
} 
char * combineWithNoSpaces(int argc, char *argv[]) { 
    int i, j; 
    int count = 0; 
    int memory = 0; 
    char *str; 
    for (i = 1; i < argc; i++) { 
     for (j = 0; j < strlen(argv[i]); j++) { 
      ++memory; 
     } 
    } 
    str = (char *) malloc(memory * sizeof(char) + 1); 
    for (i = 1; i < argc; i++) { 
     for (j = 0; j < strlen(argv[i]); j++) { 
      *(str + count) = argv[i][j]; 
      ++count; 
     } 
    } 
    *(str + memory + 1) = '\0'; 
    return str; 
} 
void freeLinkedList(struct linkedList *s) { 
    while (s != NULL) { 

     struct linkedList *temporary = s; 

     s = s->node; 

     free(temporary); 
    } 
} 
void printMenu(void) { 
    printf("\n\n" 
      "1. print input arguments (no spaces)\n" 
      "2. remove first character\n" 
      "3. remove vowels\n" 
      "4. is the linked list empty?\n" 
      "5. exit program\n" 
      "Enter your choice>"); 
} 

プログラムは、メニューが表示されます。整数選択肢3はremoveVowels()を実行する母音を削除するためのもので、さらにlocateVowels()を実行します。出力用 のスクリーンショットは、次のとおりです。その終了文字終了文字あなたはtemporaryNULLではありませんチェックする必要があり、あなたのremoveVolwel()機能では母音 argument ending with vowel

+0

[デバッガの使い方](http://www.cprogramming.com/gdbtutorial.html)を学んでください。 –

+0

申し訳ありません。私は無力です。 – user3213732

+0

おそらく、このリンクが役立ちます:https://www.owasp.org/index.php/Using_freed_memory –

答えて

1
removeVowels

struct linkedList *temporary = s->node;
temporaryとして

アップデート機能がNULLになります。
したがってtemporary->chとしてNULL->chが発生します。

次のコード修正の方法のいずれかを(ポリシー上書きするのではなく、ノードを削除する。)

void removeVowels(struct linkedList *s) { 
    s = locateVowel(s); 

    while (s != NULL) { 
     struct linkedList *temporary = s->node; 
     if(temporary == NULL){ 
      s->ch = '\0'; 
      s->node = NULL; 
      break; 
     } else { 
      s->ch = temporary->ch; 
      s->node = temporary->node; 
     } 

     free(temporary); 

     s = locateVowel(s); 
    } 
} 

void printLinkedList(struct linkedList **s) { 
    if ((*s) != NULL && (*s)->ch != '\0') { 
     printf("%c", (*s)->ch); 
     printLinkedList(&(*s)->node); 
    } 
    return; 
} 
0

ある母音 argument with no ending vowel 引数ではありません
引数。 sが最後の要素であるとき

void removeVowels(struct linkedList *s) { 

    s = locateVowel(s); 

    while (s != NULL) { 
     struct linkedList *temporary = s->node; 
     /**********************/ 
     if (temporary == NULL) { 
      break 
     } 
     /******************/ 
     s->ch = temporary->ch; 
     s->node = temporary->node; 

     free(temporary); 

     s = locateVowel(s); 
    } 
} 
+0

最後の要素の最後の母音要素は削除されません。 – BLUEPIXY

+1

はい、正確にプログラムはクラッシュしませんでした..しかし、最後の母音は削除されていません..あなたは何か考えていますか? – user3213732

+0

@ user3213732、私はクラッシュのために解決しました。最後の母音を削除しない理由を理解するために、コードを理解する必要があります。あなたはその方がいいですか? – Rohan

0

慎重。通常、最後のリンクはNULLを指しています。

+------+  +------+  +------+ 
| data |  | data |  | data | 
+------+  +------+  +------+ 
| next |---->| next |---->| next |----> NULL 
+------+  +------+  +------+ 
^
    | 
START (Keep track of the whole list.) 

希望を明確にするのに役立ちます。

関連する問題