c语言 链表 输入问题,编译没错误, 运行 错误

#include
#define M 20
int f(char a[])
{
int i ;
i=0;
while (a[i]='\n')
i++;
i--;
while (i>0&& a[i]==' '||a[i]=='\t')
i--;
if(i>0)
{
i++;
a[i]='\n';
i++;
a[i]='\0';
}
return 1;
}

int getline (char s[],int lim )
{
int c,i,j;
j=0;
for (i=0;(c=getchar())!=EOF&&c!='\n';i++)
{
if(lim<i-2)
{
s[j]=c;
++j;
}
if(c=='\n')
{
s[j]=c;
++j;
++i;
}
s[j]='\0';

}
return i;

}
int main ()
{
char a[M];
while (getline (a,M)>0)
if(f(a)>0)
printf ("%s",a);
return 0;
}

仔细调试下,看看输入、输出、指针之类

运行 错误,具体是什么错误呢?程序异常,还是没有达到你想要的效果?如果是没有达到你想要的效果,你想要的效果是什么呢?实际运行的结果又是什么呢?
学习编程,不只是写程序,更重要的是调度程序,从而发现编写的代码的问题、改正之,以达到想要的结果。

最简单的,先分函数调度,保证每个函数实现想要的功能。然后,再看整体运行的结果是否满足要求。

看了一会,没看懂你要实现什么功能。所以就不能帮你改代码了,
只能把我对你代码的分析以及写错的地方找出来,请参考

 #include <stdio.h>
#define M 20
int f(char a[])
{
    int i;
    i = 0;
    while (a[i] = '\n')//这里写错了,写成了等号,这里是个死循环
        i++;
    i--;
    while (i > 0 && a[i] == ' ' || a[i] == '\t')
        i--;
    if (i > 0)
    {
        i++;
        a[i] = '\n';
        i++;
        a[i] = '\0';
    }
    return 1;
}

int getline(char s[], int lim)
{
    int c, i, j;
    j = 0;
    for (i = 0; (c = getchar()) != EOF&&c != '\n'; i++)
        //这里的判断条件的意思是:用户一次性输入几个字符,就循环几次。
    {
        if (lim < i - 2)
            //lim等于20,循环一次,i加一。也就是说,只有用户一次性输入24个字符,才会进这个判断语句
        {
            s[j] = c;
            ++j;
        }
        if (c == '\n')//只要能进这个for循环,就一定不会执行这句判断里面的语句
        {
            s[j] = c;
            ++j;
            ++i;
        }
        s[j] = '\0';
    }
    return i;


}
int main()
{
    char a[M];
    while (getline(a, M) > 0)
    if (f(a) > 0)
        printf("%s", a);
    return 0;
}