2012-04-10 10 views
1

ファイルに表示される単語のリンクリスト(繰り返しはありません)と、最初に表示される行を作成しています。私は難しい部分であると思っていたことを終えました(ファイルを解析しながらファイルを解析する)が、今私の方法の一つで問題を抱えていると思います。私のコードは2つのファイルに含まれていますが、ドライバと一緒にコードに問題があるメソッドだけを含んでいます。 (それがファイルを見つけることができなかったし、それが実行されないだろうと言い続けているため、私はGDBを使用してみました、私は私が間違ってそれを使用していたと思います。)リンクリストの問題

int main(int argc, char **argv){ 
file = fopen(argv[1],"r"); 
/*struct fileIndex *fIndex = NULL;*/ /*put this in header file??*/ 
fIndex = NULL; 
delimiters = " .,;:!-";/*strtok chars to seperate*/ 
rewind(file); 
int buffer = 65; 
char str[buffer+1];/*where the lines are being stored*/ 
char *token, *cp; 
int i; 
int len; 
while((fgets(str, buffer, file))!=NULL){/*inserting lines*/ 
for(i=0; i<buffer; i++){ 
    if(str[i]=='\n'){ 
    str[i]= '\0'; 
    break; 
    } 
} 
len = strlen(str); 
cp = xerox(str); 
token = strtok(cp, delimiters); 
/*if(token!=NULL) 
printf("The word is %s\n", token);*/ 
    if(!present(fIndex, token)&&(token!=NULL)){ 
     insert(fIndex, i+1, token); 
    } 
    while(token!=NULL){ 
     token = strtok(NULL, delimiters); 
     /*if(token!=NULL) 
     printf("The word is %s\n", token);*/ 
     if(!present(fIndex, token)&&(token!=NULL)){ 
      insert(fIndex, i+1, token); 
     } 

    } 
} 
fclose(file); 
struct fileIndex *root; 
root = fIndex; 

while(root != NULL){ 
printf("The string is %s and on line %d\n", root -> str, root -> lineNum); 
root = root -> next; 
} 


free(fIndex); 
free(cp); 

return 0; 
} 







struct fileIndex *insert(struct fileIndex *head, int num, char *insert){ 
struct fileIndex* newnode = malloc(sizeof(struct fileIndex)); 
if(newnode==NULL) 
exit(1); 

newnode -> str = insert; 
newnode -> lineNum = num; 

newnode -> next = head; 
return newnode; 
} 

編集:私はまた私の中で問題を考えています単語がすでにあるかどうかを調べるメソッド。私は、単語が挿入され、すべての単語が印刷される場合にのみ印刷する必要があるprint文を入れます。リストを印刷する最後の小さなループは印刷されていないので、最初にそこに到達してループしないときにはNULLに達すると思います。

present(struct fileIndex* fIndex, char *findIt){/*finds if word is in structure*/ 
struct fileIndex* current = fIndex; 
while(current!=NULL){ 
current = current -> next; 
if(strcmpigncase(current -> str, findIt)==0){ 
    return current -> lineNum; 
} 
} 
return 0; 
} 
+1

どのような問題がありますか? –

答えて

2

insert関数は新しいリストを返しますが、コードで戻り値を使用していません。

呼び出しは次のようになります。

fIndex = insert(fIndex, i+1, token); 

は補遺:それがNULLであるかどうかをチェックする前に

また、あなたはトークンを使用しています。

if((token!=NULL) && !present(fIndex, token)){ 
    fIndex = insert(fIndex, i+1, token); 
} 
+0

これを修正しましたが、今ではsegフォルトが発生します。 – Sams

+1

あなたの現在の関数は、現在のポインタを最下位のループではなく最上位に進めています。 –

+0

ありがとうございます。私はまたヘッダーが間違っていることに気づいた!私は戻り値を残しました!私の論理問題の1つを解決する必要があります。 – Sams

2

fopen()が成功したことを常に確認する必要があります。

if(file == NULL) { 
printf("Error fopen"); 
exit(1); 
} 

fgets()は、NULLターミネータを追加し、あなたが自分で行う必要はありません。

0

fopen()が成功したことを確認するのを忘れました。あなたはもっと優雅に終了よりもエラーを処理できる場合

if (!file) { 
    fprintf(stderr, "unable to open %s\n", argv[1]); 
    perror(argv[0]); 
    exit(EXIT_FAILURE); 
} 

、あなたがそうすることを望むかもしれません:すべてのfopen(3)は次のようにコードが続くべきである(バックデフォルトにフォール?)。

for(i=0; i<buffer; i++){ 
    if(str[i]=='\n'){ 
    str[i]= '\0'; 
    break; 
    } 

これはかなり醜いです。あなたは自分をヌルで終了する必要はありませんが、その後、改行を削除したい場合にも、私は実際にfIndexを見たことがない...

struct fileIndex *root; 
root = fIndex; 

while(root != NULL){ 
    printf("The string is %s and on line %d\n", root -> str, root -> lineNum); 
    root = root -> next; 
} 


free(fIndex); 
free(cp); 

をあなたの行番号のために改行をカウントしていることを確認する必要があり割り当てられた - それは単なるポインタであり、あなたはそれを最初にNULLに割り当てました。コードのこのセクション全体に目を向けます。適切なインデントと周囲の文脈の欠如は、理解することをほとんど不可能にします。このコードをすべて自分のルーチンに分けて、ハードコードされたテストを使って完全にテストし、大きなプログラムに組み込む前に完全に動作することを確認する必要があります。 (実際には最初の部分にも行きますが、いくつかの隔離された指向テストの恩恵を受けるようです。)

+0

実際にプリントループでリストを作っていることをテストしようとしていました。 – Sams

関連する問題