题目
编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行。
自我解答:
编程思想:
首先把这里的“完全是空格的行”理解为 包含一个换行符和0~n个空格或制表符的行。编程思路是对于输入的每一行纪录下最后一个非空格或制表符到行末换行符之间的长度,在接下来拷贝这一行时不对这些字符进行拷贝。下面程序中用getline函数获取文本中的一行,用copy函数把获取的一行去除行尾空格及制表符,MAXLINE用于标记获取行的最大长度(由于有换行符合终止符,实际获取输入行的最大长度是998,见下面解析)。
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[])
{
int c;
int len = 0;
while(len < MAXLINE - 1 && (c = getchar()) != EOF && c != '\n')
{
line[len] = c;
len++;
}
if(c == '\n')
{
line[len] = c;
len++;
}
line[len] = '\0';
return len;
}
void copyLine(char to[], char from[])
{
int i = 0;
int lenSpaceTab = 0;
while((to[i] = from[i]) != '\0')
{
if(from[i] == ' ' || from[i] == '\t')
{
lenSpaceTab++;
}
else if(from[i] != '\n')
{
lenSpaceTab = 0;
}
i++;
}
if(lenSpaceTab > 0)
{
to[i - lenSpaceTab - 1] = '\n';
to[i - lenSpaceTab] = '\0';
}
if(to[0] == '\n')
to[0] = '\0';
}
int main()
{
int lenLine;
char line[MAXLINE] = {'\0'};
char newLine[MAXLINE] = {'\0'};
while((lenLine = getline(line)) > 0)
{
copyLine(newLine, line);
printf("%s", newLine);
}
return 0;
}
解析:getline函数用于获取输入中的一行,当输入行的字符总长度小于MAXLINE时,getline能完全获取这一行的所有字符。考虑临界情况,例如当MAXLINE设置为1000时,当输入行的字符个数为999时,这些字符存储在line[0] ~ line[998],line[999]设置为'\0'