2012-05-01 12 views
-1

私は単語を読むためにこの関数を作成しました。私はセグメンテーションの欠陥があり、問題を見つけることができません。ここに私がしたことがあります。C:セグメント化エラー

void LeeCaracter(FILE * fp, char * s) 

{ 

    char c; 
    int i = 0; 

    c = fgetc(fp); 
    while(c==' ' || c=='\t' || c=='\n') 
     c = fgetc(fp); 
    while(c!=' ' && c!='\n') 
     { 
      s[i] = c; 
      i++; 
      c = fgetc(fp); 

     } 
    s[i] = '\0'; 
} 

は、後で使用する必要があるため、ポインタパラメータです。 1つだけ*書くのは正しいですか?ご協力いただきありがとうございます!

*単語の後に続く文字( ''または '\ n')を知りたければどうなりますか? whileループの後にこれを追加しました: "printf("%c "、c);" しかし、何も印刷されません。何か案は?

答えて

0

入力ファイルに最大文字を含む単語を格納するのに十分なスペースが 's'にあることを確認する必要があります。次に、「ファイルの終わり」を確認する必要があります。ここには働くバージョンがあります。私はそれがあなたのためにも働くことを願っています。

#include <stdio.h> 

void LeeCaracter(FILE * fp, char * s) 
{ 
    char c; 
    int i = 0; 

    c = fgetc(fp); 
    if (feof(fp)) return; 
    while (c == ' ' || c == '\t' || c == '\n') 
    c = fgetc(fp); 
    while (!feof(fp) && (c != ' ' && c != '\n')) { 
    s[i++] = c; 
    c = fgetc(fp); 
    } 
    s[i] = '\0'; 

    printf("%s\n", s); 
} 

int main(void) 
{ 
    char s[128]; /* assuming no word is larger than this size */ 
    FILE *fp = fopen("/usr/share/dict/words", "r"); 

    while (!feof(fp)) { 
    LeeCaracter(fp, s); 
    } 

    return 0; 
} 
+0

正確には、それはエラーでした。ありがとうございました! – user1367988

2

は考えてみましょう:

while(c==' ' || c=='\t' || c=='\n') 
    c = fgetc(fp); 

ので、この時点で、cは' ''\n'ですされていない二つのことを。それで:

ループのcの値は変更されないので、while条件は常にtrueです。かなり早くそれを意味する、s[i]は外出する。あなたはsの長さをチェックする必要があります。おそらくそれをパラメータとして渡すことで(おそらくあなたのアルゴリズムを少し考え直してください - おそらくもっとループの内側にfgetcしたいでしょう)。

+0

あなたは正しいです。ありがとうございました!しかし、とにかく、まだどこかのセグメンテーションフォールトがあります。 – user1367988

+0

's'はどこから来たのですか?私が言ったように、あなたはまた、そのループでそれをチェックする境界にする必要があります。 – delicateLatticeworkFever

+2

@ user1367988ファイルの終わりに達すると、 'fgetc'は常に' EOF'(通常は-1)を返し、再び無限ループになります。 –

関連する問題