源自<The C language programming>
编写一个程序,删除每个输入行末尾的空格以及制表符,并删除完全是空格的行
getline函数,能够在读入文本行时返回该行的长度,而在遇到文件结束符时返回0
由于0不是有效的行长度,因此可以作为标志文件结束的标志.
每一行,至少包括一个字符,只包含换行符的行,其长度为1
1.下面的代码只是并未真正删除空格以及制表符,只是让其不再显示
#include<stdio.h>
//#include<stdlib.h>
#define MAXLINE 1000
int getline(char s[], int lim);
int main(){
int len,i;
char line[MAXLINE];
while( (len = getline(line,MAXLINE))> 0){ //如果还有未处理的输入行 ,len为输入行的长度
//printf("%s",line);
for(i = 0; i < len; i++) //打印输入行
printf("%c",line[i]);
//printf("\n");
}
//system("pause");
return 0;
}
int getline(char s[], int lim){
int i,j,len;
char 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';
len = i;//len表示字符串的长度
//从字符串的末尾开始处理,输入行末尾是空格及制表符,并且输入行完全是空格的情况
for(j = i - 1; j >= 0;j--){
if(s[j] != ' ' && s[j] != '\t') //如果从字符串末尾开始,遇到不是' '且不是'\t'
break; //则跳出循环,处理结束
if(s[j] == ' ' || s[j] == '\t') //如果遇到' '或者'\t',则将字符串的长度--
len--;
}
return len;
}
2.书上的答案
#include<stdio.h>
#include<stdlib.h>
#define MAXLINE 1000
/*编写一个程序,删除每个输入行末尾的空格及制表符,
并删除完全是空格的行
*/
int getline(char s[],int lim);
int remove(char s[]);
int main(){
char line[MAXLINE];
while( getline(line,MAXLINE) > 0){ //如果存在未处理的输入行
if(remove(line) > 0)
printf("%s",line);
}
system("pause");
return 0;
}
int getline(char s[], int lim){
int i;
char 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;
}
int remove(char s[]){
int i = 0;
while(s[i] != '\n') //每个输入行末两位是'\n','\0'
i++;
i--; //back off from '\n'
//如果当前的字符为' ' 或者为'\t',则i继续向前进行判断
while( i >=0 && (s[i] == ' ' || s[i] == '\t' )){
i--;
}
//is it a noblank line?
if(i >= 0){ //如果i>=0,则表明输入行不是空行,至少有一个字符
i++;
s[i] = '\n'; //put newline character back
i++;
s[i] = '\0'; //terminate the string
}
return i;//返回newline的长度
}
remove函数负责删除掉字符line末尾的空格和制表符并返回他的新长度
如果这个长度 > 0 ,则说明line中有不是空格和制表符的其他字符,程序就会把这以后打印出来
,否则就说明这一行完全是由空格和制表符构成的,程序就将忽略掉这一行
remove函数首先找到'\n'
然后倒退一个位置,随后这个函数从后向前检查空格或制表符,直到他找到一个不是空格或者制表符的字符,或者没有字符可让它继续倒退(i < 0)
如果i >= 0,则表明至少有一个字符,此后,函数remove将换行符和字符串结束符写回输入行,再返回变量i