当遇到EOF时,K& R练习1-18给出了分段错误

时间:2016-01-26 20:51:08

标签: c

我一直坚持这个问题:

  

编写程序以从每个输入行删除尾随空白和制表符,并删除完全空行。

过去几个小时,我似乎无法让它正常工作。

#include<stdio.h>
#define MAXLINE 1000

int mgetline(char line[],int lim);
int removetrail(char rline[]);

//==================================================================
int main(void)
{
    int len;
    char line[MAXLINE];

    while((len=mgetline(line,MAXLINE))>0)
        if(removetrail(line) > 0)
            printf("%s",line);

    return 0;
}
//==================================================================

int mgetline(char s[],int lim)
{
    int i,c;

    for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
        if( c == '\n')
        {
            s[i]=c;
            ++i;
        }
    s[i]='\0';

    return i;
}

/* To remove Trailing Blanks,tabs. Go to End and proceed backwards removing */

int removetrail(char s[])
{
    int i;

    for(i = 0; s[i] != '\n'; ++i)
        ;
      --i;  /* To consider raw line without \n */

    for(i > 0; ((s[i] == ' ') || (s[i] == '\t')); --i)   
        ; /* Removing the Trailing Blanks and Tab Spaces */

    if( i >= 0) /* Non Empty Line */
    {
        ++i;
        s[i] = '\n';
        ++i;
        s[i] = '\0';
    }
    return i;
}

我在debian中使用gedit文本编辑器。

无论如何,当我在终端输入文本并点击输入时,只需将整行复制下来,如果我输入带有空格和标签的文本,我按下EOF(ctrl + D),我会得到分段错误。

我猜程序内存不足和/或使用内存块#&#39;在它的阵列之外,我仍然是所有这一切的新手。

感谢任何形式的帮助,提前谢谢。

P.S。:我尝试使用解决方案书中的代码和互联网上随机网站的代码,但是当遇到EOF时,它们都会给我分段错误消息。

1 个答案:

答案 0 :(得分:5)

很简单:

mgetline返回填充了您输入的数据的缓冲区,有两种情况:

  • 遇到新行字符时
  • 遇到EOF时。

在第一种情况下,它将新行char放入缓冲区,在后者中 - 它没有。

然后将缓冲区传递给removetrail函数,该函数首先尝试查找换行符:

for(i=0; s[i]!='\n'; ++i)
    ;

但是当你点击Ctrl-D时,没有新的行字符!因此,当您通过映射内存时,会出现内存访问异常。