C:分段错误

时间:2012-05-01 15:06:35

标签: c pointers segmentation-fault

我创建了这个函数来读一个单词。我有分段错误,我找不到问题。这就是我所做的。

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

是一个指针参数,因为我以后必须使用它。用一个*写它是否正确?谢谢你的帮助!

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

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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;
}