【问题标题】:segmentation fault in feof(FILE *) inbuilt Functionfeof(FILE *) 内置函数中的分段错误
【发布时间】:2013-01-09 14:23:10
【问题描述】:
void suffix_strip(FILE *fp)
{
    FILE *fp1;
    char word[20],ch;
    int len;
    int i=0,j;
    fp1=fopen("sstrip.txt","a+");
    while(!feof(fp))
    {
        ch=fgetc(fp);
        if(ch!='\n' && ch!='\0' && ch!=' ' && ch!='.')
        {
            word[i]=ch;
            i++;
        }
        else
        {
            word[i]='\0';
            i=0;
            len=strlen(word);
            if(len>3)
            {
                if(word[len-3]=='i' && word[len-2]=='n' && word[len-1]=='g')
                {
                    word[len-3]='\0';
                }
                else if(word[len-2]=='e' && word[len-1]=='d')
                {
                    word[len-2]='\0';
                }

                fputs(word,fp1);

                if(count==0)
                {
                    in[count]->freq=1;
                    strcpy(in[count]->word,word);
                    count++;
                }
                else
                {
                    for(j=0;j<count;j++)
                    {
                        if(strcmp(in[j]->word,word)==0)
                        {
                            in[j]->freq++;
                            goto x1;
                        }
                    }
                    in[count]->freq=1;
                    strcpy(in[count]->word,word);
                    count++;
                    x1:
                        printf("");

                }
                fputc(' ',fp1);
            }
            else
            {
                fputs(word,fp1);
                if(count==0)
                    {
                    in[count]->freq=1;
                    strcpy(in[count]->word,word);
                    count++;
                }
                else
                {
                for(j=0;j<count;j++)
                {
                    if(strcmp(in[j]->word,word)==0)
                    {
                        in[j]->freq++;
                        goto x2;
                    }
                }
                in[count]->freq=1;
                strcpy(in[count]->word,word);
                count++;
                x2:
                    printf("");

            }
            fputc(' ',fp1);
        }

    }

    }
    display();

}

/*

在上述函数中,当我进入 While 循环检查条件时

while(!feof(fp))

运行 MinGW GCC 的 DevC++ IDE 会引发分段错误,但在 VC++ 6.0 上运行相同的代码时,代码运行成功,没有任何错误。 可能是什么问题??? 是因为我将文件指针作为参数传递吗??? GCC 编译器的 EOF 表示还有一些其他约定??? 如果是因为参数传递,那么使用相同的参数传递方式(即传递文件指针)解决它的正确方法是什么? */

【问题讨论】:

  • Dev-C++ 已经过时了。我建议在 Windows 上切换到 MSVC(它是免费的),或者如果您真的想使用 MinGW,请学习使用命令行界面(即 MSYS)和简单的编辑器(崇高文本?)来编写代码(查看 CodeBlocks但是,替代 IDE)。
  • 删除while() 循环中除ch=fgetc(fp); 之外的所有内容,然后查看问题是否仍然存在。我敢打赌,你超出了一些数组边界,这会弄乱你的堆栈(包括FILE *fp 参数)。

标签: c pointers gcc segmentation-fault file-pointer


【解决方案1】:
  1. 确保文件打开成功。也许您将NULL 传递给feof()
  2. 在进行 I/O 之前不要调用 feof()在 I/O 失败时调用它。
  3. fgetc() 返回一个int不是一个char。这是因为它还可以返回不是字符的特殊值EOF

【讨论】:

    【解决方案2】:

    可能word[] 溢出。如果要截断单词,请更改

                word[i]=ch;
                i++;
    

                if (i < sizeof word - 1) word[i++] = ch;
    

    .

    【讨论】:

      猜你喜欢
      • 2018-04-10
      • 2011-07-22
      相关资源
      最近更新 更多