我一直坚持这个问题:
编写程序以从每个输入行删除尾随空白和制表符,并删除完全空行。
过去几个小时,我似乎无法让它正常工作。
#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
时,它们都会给我分段错误消息。
答案 0 :(得分:5)
很简单:
mgetline
返回填充了您输入的数据的缓冲区,有两种情况:
在第一种情况下,它将新行char放入缓冲区,在后者中 - 它没有。
然后将缓冲区传递给removetrail
函数,该函数首先尝试查找换行符:
for(i=0; s[i]!='\n'; ++i)
;
但是当你点击Ctrl-D
时,没有新的行字符!因此,当您通过映射内存时,会出现内存访问异常。