-1

単語を読むためにこの関数を作成しました。セグメンテーション違反が発生しましたが、問題が見つかりません。これが私がやったことです。

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'; 
}

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

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

4

2 に答える 2

2

検討:

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

したがって、この時点で、cではない2つのものは' ''\n'です。それで:

while(c!=' ' && c!='\n')
  {
      s[i] = c;
      i++;
  }

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

于 2012-05-01T15:11:11.037 に答える
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;
}
于 2012-05-01T15:42:52.420 に答える