编写一个程序,删除每一个输入行末尾的空格及制表符,并删除完全是空格的行。
这边之前已经有了获取一个输入行的函数:
int getline(char *line, int maxline)
{
char ch;
int len;
len = 0;
while((ch = getchar()) != '\n' && ch != EOF && len < maxline)
{
line[len++] = ch;
}
line[len]= '\0';
return len;
}
下面是针对于一行语句进行trim操作,我们函数命名del0char:
int del0char(char *line)
{
int len = strlen(line);
//find the first ' ' or '\t'
char ch = line[--len];
//printf("len = %d~", len);
while( (ch == ' ' || ch == '\t') && len >= 0)
{
ch = line[--len];
}
//if the last char of line is blank,then change something
if(line[len+1] == ' ')
line[len+1] = '\0';
}
然后在主方法中做测试:
int main(int argc, char *argv[])
{
char lines[MAXLEN][MAXLINE];
char line[MAXLINE];
int len ;
int j;
int i = 0;
while((len = getline(line, MAXLINE)) != 0)
{
printf("before: %s~\n", line);
del0char(line);
strcpy(lines[i++], line);
}
//press twice 'enter' exit the program
for(j = 0; j< i; j ++)
{
printf("finally: %s~\n",lines[j]);
}
}
其中
#define MAXLEN 100
#define MAXLINE 100
测试结果:
字符串的倒序操作:
//reverse the string
void reverse(char *s)
{
int len;
int i,j;
len = strlen(s);
i = 0;
j = len -1;
for(; i < j; i++,j--)
{
swap(s, i, j);
}
}
int main(int argc, char *argv[])
{
char line[MAXLEN];
int len ;
while((len = getline(line, MAXLINE)) > 0)
{
reverse(line);
printf("%s\n",line);
}
return 0;
}
test result:
当然,网上有很多的这样的类似字符串倒序算法。
//decode the '\t' to blank
void detab(char *line, char *newLine, int len)
{
int i ,j ;
for(i = 0,j=0; i<len; i++)
{
if(line[i] == '\t')
{
//calculate the number of blank, and print them into memory
int k = 8-i%8;
while(k>0)
{
newLine[j++] = ' ';
k--;
}
}else
{
newLine[j++] = line[i];
}
}
newLine[j] = '\0';
}
这边是这样子的,把制表符‘\t’置换成一定数量的空格。上面中我们可以把制表符的长度8置换成常量。现在我们反过来编写将一定数量的空格改写成制表符,尽管在显示上看起来是没有什么样的任何变化的,实际上制表符的所用内存就会是少了很多。