-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 是一个指针参数,因为我以后必须使用它。只写一个*是否正确?谢谢你的帮助!

*如果我想知道单词后面的字符(' ' or '\n')怎么办?我在 while 循环之后添加了这个:“printf("%c",c);" 但它不打印任何东西。有任何想法吗?

4

2 回答 2

2

考虑:

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

所以,在这一点上,c 不是的两件事是' ''\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 回答